http://acm.hdu.edu.cn/showproblem.php?pid=1024

求m个子段的最大和。思路见代码注释。

View Code
#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;
}