zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    E
    J
    D
    并查集加优先队列
    动态规划-数位DPwindy
    动态规划-分组背包问题
    动态规划-LIS1
    动态规划-01背包
    [cf1434E]A Convex Game
    [atAGC106F]Figures
  • 原文地址:https://www.cnblogs.com/flyljz/p/14076326.html
Copyright © 2011-2022 走看看