Max Sum Plus Plus HDU - 1024

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Max Sum Plus Plus HDU - 1024相关的知识,希望对你有一定的参考价值。

Max Sum Plus Plus HDU - 1024

题意:

给你n个数,选m个子段,各个子段连续且不相交,长度可以为1,设maxn为各个子区间的和,求最大的maxn。

题解:

设dp[i][j]表示前j个数分成i段的最大值
对于第j个数,他可以加入到已有的第i段,也可以自己成为第i段的开始,因此得到状态转移为:
dp[i][j]=max(dp[i][j-1],dp[i-1][k])+a[j]
(0<k<j),,dp[i-1][k]取最大值,k相当于第i-1段的结束位置,二维的话n太大存不下,我们需要继续优化,dp[i-1][k] + a[j](0 < k < j) 这一项可以另外开一个一维数组tmp[k]记录一下上一层的前缀最大值(dp[i-1][k]的最大值,0<k<j),这样就优化成一维
dp[j]=max(dp[j-1],tmp[j-1])+a[j];
tmp[j-1]表示上一层的最大值

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;

inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
const int INF=0x3f3f3f;
const int maxn=1e6+9;
int a[maxn];
int dp[maxn];
int tmp[maxn];
int main()
{
	int n,m;
	while(~scanf("%d %d",&m,&n))
	{
		for(int i=1;i<=n;i++)cin>>a[i];
	}
	dp[0]=-INF;
	for(int i=1;i<=m;i++){
		maxx=-INF;
		for(int j=i;j<=n;j++){
			dp[j]=max(dp[j-1],tmp[j-1])+a[j];
			tmp[j-1]=maxx;
			maxx=max(maxx,dp[j]);
		}
	}
	cout<<maxx<<endl;
	
}

以上是关于Max Sum Plus Plus HDU - 1024的主要内容,如果未能解决你的问题,请参考以下文章

[2016-03-28][HDU][1024][Max Sum Plus Plus]

hdu 1024 Max Sum Plus Plus(简单dp)

hdu-1024 Max Sum Plus Plus

Max Sum Plus Plus HDU - 1024

hdu 1024 Max Sum Plus Plus

HDU - 1024 Max Sum Plus Plus 滚动数组优化