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; }
多学习,多总结。