luogu P2706 巧克力
(第一道绿题)
有点像最大子矩阵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 = -1000005; int n,m; long long k,ans,a[350][350],sum[1000005]; int main() { scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%lld",&k); if(k == 0)k = INF; a[i][j] = k + a[i][j-1]; } for(int l = 1; l <= m; l++) for(int r = l; r <= m; r++) for(int k = 1; k <= n; k++) { sum[k] = a[k][r] - a[k][l-1]; sum[k] = max(sum[k],sum[k]+sum[k-1]); ans = max(ans,sum[k]); } printf("%lld",ans); return 0; }