Max Sum Plus Plus HDU-1024
题意:给你n个数,让你找m组个连续序列,使m个连续序列最大(要求也是序列不重叠),输出m组序列和的最大值。
这题的状态转移方程 dp[i][j]=max(dp[i][j-1]+a[j],Max(dp[i][k]+a[j]));
思路:刚接触DP还不是很会,然后看了别人的解题思路,想了好一会他的过程。
首先把看成求一段序列的最大连续子序列——可得到状态转移方程为:dp[j]=max(0,dp[j-1])+a[j];—-求到j为止当前序列的最大连续子序列。
题目要求m组。主要就是Max[N+10],数组的使用,Max[N+10],记录前dp[j]的最大值。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1000000;
const int inf=0x7f7f7f7f;
int dp[N+10],Max[N+10];
int a[N+10];
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
memset(Max,0,sizeof(Max));
int maxn;
for(int i=1;i<=m;i++)
{
maxn=-inf;
for(int j=i;j<=n;j++)
{
dp[j]=max(dp[j-1]+a[j],Max[j-1]+a[j]);
Max[j-1]=maxn;
maxn=max(maxn,dp[j]);
}
/*cout<<i<<endl;
for(int j=i;j<=n;j++)
cout<<dp[j]<<" ";
cout<<endl;
for(int j=1;j<=n;j++)
cout<<Max[j]<<" ";
cout<<endl;*/
}
cout<<maxn<<endl;
}
return 0;
}