Ural(Timus) 1146. Maximum Sum
DP,最大子矩阵和:先按列压缩为一维i,在用最大连续子序列和来求。在枚举列压缩求和的时候,为了提高速度,可以在输入的时候先保存下来,就不用每次都去计算,不过再代码中没有写
另外这题不允许空矩阵,即至少要有一个元素,所以代码要做稍微的修改,就这样WA了几次
/*最大子矩阵和,先压缩为一维再求最大子序列和,时间复杂度O(n^3)*/ #include <cstdio> #include <cstring> #define N 1100 #define INF 0x3f3f3f3f int a[N][N],s[N],n; void get_sum(int x ,int y) { for(int i=0; i<n; i++) { s[i]=0; for(int k=x; k<=y; k++) s[i]+=a[i][k]; } return ; } int DP() { int sum=0,max=-INF; for(int i=0; i<n; i++) { sum+=s[i]; max=sum>max?sum:max; if(sum<0) sum=0; } return max; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&a[i][j]); int max=-INF,ans; for(int i=0; i<n; i++) for(int j=i; j<n; j++) { get_sum(i,j); ans=DP(); max=ans>max?ans:max; } printf("%d\n",max); } return 0; }