(第一道绿题)
有点像最大子矩阵qwq
用前缀和存图,l,r代表横向的一段区间,区间和就是a[r]-a[l-1]
然后用一个k从上到下dp...因为每次l,r变化的时候原来的k就没有用了,所以k开一个表示第几行的一维数组,把最大值记下来就行qwq
特殊的是如果为0是不能选择的...改成-∞就可以了
#include<cstdio>
#include<iostream>
using namespace std;
const int INF = -;
int n,m;
long long k,ans,a[][],sum[];
int main() {
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++) {
scanf("%lld",&k);
if(k == )k = INF;
a[i][j] = k + a[i][j-];
} for(int l = ; l <= m; l++)
for(int r = l; r <= m; r++)
for(int k = ; k <= n; k++) {
sum[k] = a[k][r] - a[k][l-];
sum[k] = max(sum[k],sum[k]+sum[k-]);
ans = max(ans,sum[k]);
}
printf("%lld",ans);
return ;
}