输入
第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
输出
输出和的最大值。如果所有数都是负数,就输出0。
输入示例
3 3 -1 3 -1 2 -1 3 -3 1 2
输出示例
7
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const 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;
}