题目链接:https://cn.vjudge.net/problem/HDU-1024
题意:给你n个数,让你找m组个连续序列,使m个连续序列最大(要求也是序列不重叠),输出m组序列和的最大值。
状态:dp[i][j] 前j个数m个连续序列,且必选j.(如果不这样定义不清楚前面的数是如何分组的)
转移方程:dp[i][j]=max(dp[i][j-1],dp[i-1][k])+a[j];(i-1<=k<=j-1)
数据太大,需要优化为一维数组。
这样会使o(n3)的复杂度,需要优化。
转移方程:dp[j]=max(dp[j-1],ma[j-1])+a[j];
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int m,n;
int a[1000100],dp[1000100],ma[1000100];
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(dp,0,sizeof(dp));
memset(ma,0,sizeof(ma));//必须要初始化
int maxn;
for(int i=1;i<=m;i++)
{
maxn=-inf;
for(int j=i;j<=n;j++)
{
dp[j]=max(dp[j-1],ma[j-1])+a[j];
ma[j-1]=maxn; //
maxn=max(maxn,dp[j]);//注意这两行代码的顺序,分清是 k<=j-1还是k<=j;不同情况,顺序不同
}
}
printf("%d\n",maxn);
}
}