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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/mogeko/p/9859317.html
今日推荐