和最大子矩阵

来源:互联网 发布:智通预算软件 编辑:程序博客网 时间:2024/05/29 09:58

题目具体分析与出处

输入

第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)

输出

输出和的最大值。如果所有数都是负数,就输出0。

输入示例

3 3-1 3 -12 -1 3-3 1 2

输出示例

7
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define ll long longconst int maxn=5e2+5;const int INF=0x3f3f3f3f;int mp[maxn][maxn];ll dp[maxn];int main(){    int N,M;    while(scanf("%d%d",&M,&N)==2)    {        for(int i=1; i<=N; i++)            for(int j=1; j<=M; j++)                scanf("%d",&mp[i][j]);        ll ans=-INF;//因为会有负数         for(int i=1; i<=N; i++)//从行开始扫描,每次循环减去一行         {            memset(dp,0,sizeof(dp));            for(int j=i; j<=N; j++)//从行开始扫描,每次扫描加上上一行             {                for(int k=1; k<=M; k++)//从列开始扫描                     dp[k]+=mp[j][k];                ll num=-INF;                for(int i=1; i<=M; i++)                {                    num=max(num+dp[i],dp[i]);//每次取本事与本身和前一个数加起来的较大的值                     ans=max(num,ans);//存下最大值                 }            }        }        printf("%lld\n",ans);    }    return 0;}