hdu Max Sum Plus Plus(动态规划+分段最大子段和)

//hdu Max Sum Plus Plus(动态规划+分段最大子段和)
#include
#include
using namespace std;
#define N 1000000+10
#define INF 0x7fffffff
int dp[N];
int mmax[N];//mmax[i]前i个的最大子段和
int a[N];
int Max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
    int n,m;
    int i,j,ansmax;//ansmax存取最大分段子段和
    while(scanf("%d%d",&m,&n)==2)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            mmax[i]=0;
            dp[i]=0;
        }
        dp[0]=0;
        mmax[0]=0; 
		//==============核心代码===========
        for(i=1;i<=m;i++)
        {
                ansmax=-INF;
                for(j=i;j<=n;j++)
                {
                    dp[j]=Max(dp[j-1]+a[j],mmax[j-1]+a[j]);
                    mmax[j-1]=ansmax;
                    ansmax=Max(ansmax,dp[j]);
                }
        }
		//===============================
        printf("%d\n",ansmax);  
          
    } 
    return 0;   
} 

你可能感兴趣的:(ACM算法与数据结构)