Codeforces Round #131(Div. 2)E题
加强版的传纸条,必须用三维解法。而且要注意初始化成负数,不然就会WA到死。。。看大神代码,用memset初始化负数。。。
1 #include <stdio.h> 2 #include <string.h> 3 int p[301][301],o[621][301][301],i,j,k; 4 int getmax(int a,int b,int c,int d) 5 { 6 int max; 7 max = a; 8 if(max < b) 9 max = b; 10 if(max < c) 11 max = c; 12 if(max < d) 13 max = d; 14 return max; 15 } 16 int main() 17 { 18 int n,max; 19 scanf("%d",&n); 20 for(i = 1;i <= n;i ++) 21 { 22 for(j = 1;j <= n;j ++) 23 scanf("%d",&p[i][j]); 24 } 25 memset(o,0xf3,sizeof(o)); 26 o[0][1][1] = p[1][1]; 27 for(k = 1;k <= n+n-2;k ++) 28 { 29 for(i = 1;i <= k+1&&i <= n;i ++) 30 { 31 for(j = 1;j <= k+1&&j <= n;j ++) 32 { 33 max = getmax(o[k-1][i][j],o[k-1][i][j-1],o[k-1][i-1][j],o[k-1][i-1][j-1]); 34 if(i == j) 35 o[k][i][j] = max + p[i][k+2-i]; 36 else 37 o[k][i][j] = max + p[i][k+2-i] + p[j][k+2-j]; 38 } 39 } 40 } 41 printf("%d\n",o[n+n-2][n][n]); 42 return 0; 43 }