/* 动态规划法压缩矩阵 核心思想:先将面压缩成线 然后用线压缩成点 在线的压缩中 动态约束条件:2<=i<= aLength ; 1.1对于任意 dp[i-1]< 0 都有 dp[i] = a[i]; 1.2 对于任意dp[i-1]>0 都有 dp[i] = dp[i-1]+a[i]; 这个是线的压缩动态方程 在面中 对应的有 任意i行到j行的数据压缩成一行 并存于数组b中 在将b数组按照1.1 ,1.2的方程进行线性压缩 具体 然后最最后的结果中求取最大值 */ #include <iostream> #include <stdio.h> using namespace std; int b[101]; int a[101][101]; int dp[101]; //面转化为线 参数n为矩阵的宽度 返回值为当前列的最大值 int line(int n); int main() { int n; int res; int max ; while(scanf("%d",&n)!= EOF) { for(int i = 1;i<= n;i++) for(int j = 1;j<= n;j++) scanf("%d",&a[i][j]); max = -100000; for(int i = 1;i<= n;i++) { for(int j0 = 0;j0<= n;j0++) { b[j0] = 0; } for(int j= 1;j<=i;j++) { for(int k = 1;k<=n;k++) b[k]+= a[i-j+1][k]; res =line(n); if(res>max) max = res; } } printf("%d/n",max); } return 0; } int line(int n) { int max = -100000; dp[1] = b[1]; max = dp[1]; for(int i = 2;i<= n;i++) { if(dp[i-1]<0) { dp[i] = b[i]; } else { dp[i] = dp[i-1]+b[i]; } if(dp[i]>max) max = dp[i]; } return max; }