51nod 1051最大子矩阵和

题面:

 

 

 

 为一维字段和最大值的二维拓展版;

考虑固定右下端点(i,j)然后固定子矩阵的高度为k,那么就可以转化为一维的最大字段和。

空间可以优化到0(n)

时间复杂度o(n^3)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=510;
ll dp[N],a[N][N];
int main()
{
    int n,m;
    cin>>m>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        scanf("%lld",&a[i][j]),a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=i;k++)
        {
            dp[k]=0;
            for(int j=1;j<=m;j++)
            {
                ll s=a[i][j]-a[i-k][j]-a[i][j-1]+a[i-k][j-1];
                if(dp[k]>0)
                 dp[k]+=s;
                else
                 dp[k]=s;
                //dp[k]=max(dp[k]+s,s);
                ans=max(ans,dp[k]);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

posted @ 2020-12-02 20:39  cumtljz  阅读(89)  评论(0编辑  收藏  举报