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

  

多学习,多总结。
原文地址:https://www.cnblogs.com/yanhaiming/p/2787369.html