zoukankan      html  css  js  c++  java
  • 51nod 1051 最大子矩阵和(DP)

    题意

    分析
    一道经典的DP题,但是我弱到差点做不出来,真的垃圾
    设置(sum(i,j)代表1-i行第j列的前缀和),然后枚举行i和行j,再枚举列k,做一遍类似一维的最大子段和即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define F(i,a,b) for(int i=a;i<=b;++i)
    #define R(i,a,b) for(int i=a;i<b;++i)
    #define mem(a,b) memset(a,b,sizeof(a))
    
    ll mp[505][505], sum[505][505];
    int m,n;//n行m列
    ll ans,ret;
    
    int main()
    {
        scanf("%d %d",&m,&n);
        F(i,1,n)F(j,1,m) 
        {
            scanf("%I64d",&mp[i][j]);
            sum[i][j]=sum[i-1][j]+mp[i][j];
        }
        ans=0;
        F(j,1,n)F(i,j,n)
        {
            ret=0;
            F(k,1,m)
            {
                if(ret+sum[i][k]-sum[j-1][k]<0) { ret=0;continue; }
                ret+=sum[i][k]-sum[j-1][k];
                ans=max(ans,ret);
                //if(ans==5) cout<<"i="<<i<<"j="<<j<<endl;
            } 
        }
        printf("%I64d
    ",ans );
        return 0;
    }
    
  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/chendl111/p/7286756.html
Copyright © 2011-2022 走看看