#include <iostream> #include <string> usingnamespace std; #define setMax(x,y) ( x = x > y ? x : y ) int N, a[16][16], b[16][40000]; int c[16][40000]; int p[16]; string str; int ans =0; typedef struct ...{ int u, v; } Num; Num trans[50000]; int len; int checkOne ( int n ) ...{ int i; for ( i =0; i <14; i ++ ) ...{ if ( n & p[i] && n & p[i +1] ) return0; } return1; } void init () ...{ str +=''; string sub; int i, j =0; while ( str.size () ) ...{ i = str.find_first_of ( '' ); sub = str.substr ( 0, i ); int sum =0; str = str.substr ( i +1, str.size () ); for ( i =0; i < sub.size (); i ++ ) sum = sum *10+ sub[i] -'0'; a[N][j ++] = sum; } N ++; } int checkPebbles ( int r, int n ) ...{ int i, sum; for ( i =0, sum =0; i < N; i ++ ) ...{ if ( n & p[i] ) sum += a[r][i]; } return sum; } void dp () ...{ int i, j; memset ( b, 0xff, sizeof ( b ) ); for ( i =0; i < N; i ++ ) ...{ for ( j =0; j < ( 1<< N ); j ++ ) ...{ c[i][j] = checkPebbles ( i, j ); } } ans =0; int u, v; for ( j =0; j < len; j ++ ) ...{ u = trans[j].u, v = trans[j].v; if ( u ==0&& v < ( 1<< N ) ) ...{ //printf ( "%d %d ", u, v ); b[0][trans[j].v] = c[0][trans[j].v]; setMax ( ans, b[0][trans[j].v] ); } } //printf ( "%d ", ans ); for ( i =1; i < N; i ++ ) ...{ for ( j =0; j < len; j ++ ) ...{ u = trans[j].u, v = trans[j].v; if ( u >= ( 1<< N ) || v >= ( 1<< N ) ) continue; if ( b[i -1][u] ==-1 ) continue; //printf ( "%d %d %d %d %d %d ", i, u, v, b[i][v], b[i - 1][u], c[i][v] ); setMax ( b[i][v], b[i -1][u] + c[i][v] ); setMax ( ans, b[i][v] ); } //printf ( "#%d ", ans ); } printf ( "%d ", ans ); } void proc () ...{ dp (); //printf ( "%d ", len ); N =0; memset ( b, 0x00, sizeof ( b ) ); } void dfs ( int i, int n, int m ) ...{ if ( i ==15 ) ...{ trans[len].u = n, trans[len ++].v = m; return; } //printf ( "%d %d %d ", i, n, m ); int li = i -1, hi = i +1; if ( li >=0&& n & p[li] || li >=0&& m & p[li] || hi <15&& n & p[hi] || n & p[i] ) dfs ( i +1, n, m ); else ...{ dfs ( i +1, n, m ); dfs ( i +1, n, m | p[i] ); } } void checkAdj () ...{ len =0; int i, j; for ( i =0, j =1; i <15; i ++, j *=2 ) p[i] = j; for ( i =0; i < ( 1<<15 ); i ++ ) ...{ if ( checkOne ( i ) ) dfs ( 0, i, 0 ); } printf ( "%d ", len ); } int main () ...{ //freopen ( "in.txt", "r", stdin ); //freopen ( "out.txt", "w", stdout ); memset ( a, 0x00, sizeof ( a ) ); checkAdj (); //pt (); N =0; while ( getline ( cin, str ) ) ...{ string t = str; if ( t =="" ) proc (); else init (); } return0; }