HDU 1024 Max Sum Plus Plus

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;

} 

 

 

你可能感兴趣的:(HDU)