最大子段和的以为与二维求解

来源:互联网 发布:写英语论文的软件 编辑:程序博客网 时间:2024/04/25 20:54

一维最大子段和很简单

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 -12 -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;}



0 0
原创粉丝点击