一维最大子段和很简单
int ans=0,dp=0;
for(int i=1;i<n;i++)
if(dp>0)
dp+=a[i];
else
dp=a[i];
输入
第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 <stdio.h>
#include <string.h>
using namespace std;
typedef long long LL;
const int maxn=505;
int d[maxn][maxn];
LL c[maxn],dp,l[maxn];
int main()
{
int n,m;
LL ans;
while(~scanf("%d%d",&m,&n))
{
ans=0;
for(int i=1;i<=n;i++)
{
for( int j=1;j<=m;j++)
scanf("%d",&d[i][j]);
}
memset(c,0,sizeof(c));
///m行n列
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
dp=0;
for(int k=1;k<=m;k++)
{
c[k]=(j==i)?(d[i][k]):(c[k]+d[j][k]);///关键地方
if(dp>0)
dp+=c[k];
else
dp=c[k];
ans=max(ans,dp);
}
}
}
printf("%lld\n",ans);
}
// cout << "Hello world!" << endl;
return 0;
}