http://acm.hdu.edu.cn/showproblem.php?pid=1024
求m个子段的最大和。思路见代码注释。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define INF -100000000 int max(int a,int b){ return a>b?a:b; } int a[1100000],now[1100000],pro[1100000];//now记录当前最大值,pro记录前一个的最大值 int main() { int n,m,i,j; int maxsum; while(~scanf("%d%d",&m,&n)) { for(i=1;i<=n;i++) scanf("%d",a+i); memset(now,0,sizeof(now)); memset(pro,0,sizeof(pro)); for(i=1;i<=m;i++) { maxsum=INF;//求m段,所以每段计算前要把最大值初始化 for(j=i;j<=n;j++) { now[j]=max(now[j-1]+a[j],pro[j-1]+a[j]);//状态转移 pro[j-1]=maxsum;//记录前一个最大值 if(maxsum<now[j])maxsum=now[j];//更新最大值 } } printf("%d\n",maxsum); } return 0; }