Max Sum Plus Plus---hdu1024(动态规划求M段的最大和)

题目链接: https://vjudge.net/contest/68966#problem/A
题意: 求n个数中m段不相交子序列的最大和
思路: 因为受到空间内存限制,而且当前状态只受上一状态影响,用滚动数组优化。

#include
using namespace std;
typedef long long ll;
const int N=1e6+5;
int a[N];
ll dp[2][N];
int main()
{
    int n,m;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
    	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	memset(dp,0,sizeof dp);
	ll ans,maxn;
	int k=0;
	for(int i=1;i<=m;i++)
	{
		k=k^1;
		dp[k][i]=dp[k^1][i-1]+a[i];
		maxn=dp[k^1][i-1];
		ans=dp[k][i];
		for(int j=i+1;j<=n;j++)
		{
			maxn=max(dp[k^1][j-1],maxn);
			dp[k][j]=max(maxn+a[j],dp[k][j-1]+a[j]);
			ans=max(ans,dp[k][j]);
		}
	}
	cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(DP)