没想到居然可以O(n3)暴力过
就是大概之前的 最大连续子序列和
加成2维度了 枚举起始列 和 终止列 然后计算从1到n行最大的子矩阵的和
注意n 和 m 的输入顺序!!
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 600; ll s[maxn][maxn],sum[maxn][maxn]; int main () { int m,n; scanf("%d %d",&m,&n); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%lld",&s[i][j]); sum[i][j] = sum[i][j-1] + s[i][j];//sum[i][j]记录第i行从1到j的前缀和 } } ll res=0; for(int l=1;l<=m;l++) { for(int j=0;j+l<=m;j++)//枚举起始 终止列 { int r = l+j; ll x= 0; for(int k=1;k<=n;k++)//每行 { x = max(x,(ll)0) +sum[k][r] -sum[k][l-1]; res = max(res,x); } } } printf("%lld\n",res); }