HDOJ 1024

#include<iostream>
using namespace std;
const int N = 1000005;
 
int p[N],pre_max[N];
 
int max(int a,int b)
{
    return a>b?a:b;
}
 
int main()
{
    int i,j,k,m,n,curMax,Max;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(pre_max,0,sizeof(pre_max));
        for(i=1; i<=n; i++)
            scanf("%d",&p[i]);
        for(i=1; i<=m; i++)
        {
            curMax = 0;
            for(j=1; j<=i; j++)
                curMax += p[j];
            Max = curMax;
            for(j=i+1; j<=n; j++)
            {
                //此时的pre_max[j-1]表示:前j-1项中含i-1个子段的最大和,且最后一个子段的最后一项是p[j-1];
                curMax = max(curMax,pre_max[j-1]) + p[j];
                //更新后的pre_max[j-1]表示:前j-1项中含i个子段的最大和,且最后一个子段的最后一项是p[j-1];
                pre_max[j-1] = Max;
                Max = max(curMax,Max);
            }
        }
        printf("%d\n",Max);
    }
    return 0;
}

  

posted @   Frank@609  Views(218)  Comments(0Edit  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示