P1719题解

· · 题解

这道题挺水的,呵呵,讲白了就是求最大子矩阵, 方法么,学过线性动态规划的同学们应该简单的吧,基础啊!这题其实可以优化的,就用前缀和,具体看一下代码, 走起:

#include <iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
LL G[550][550];
int main()
{
    int m,n,i,j,k;
    LL a[550],dp[550],maxn,x;
    scanf("%d%d",&m,&n);
    memset(G,0,sizeof(G));
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            scanf("%lld",&x);
            G[i][j]=G[i-1][j]+x;//每行的前缀和
        }
    }
    maxn=0;
    for(i=1;i<=n;i++)
    {
        for(j=i;j<=n;j++)
        {
            dp[0]=0;
            for(k=1;k<=m;k++)
            {
                a[k]=G[j][k]-G[i-1][k];
                dp[k]=max(a[k],a[k]+dp[k-1]);
                maxn=max(maxn,dp[k]);
            }
        }
    }
    printf("%lld",maxn);
    return 0;
}

好了,一道水题。。。。。