HDU 1024 Max Sum Plus Plus
题意: 给你一段含有 n 个数的序列,将它分成 m 份,问你这 m 份的最大值可以是多少。
分析: 状态转移方程:
dp[i][j]=max(dp[i][j-1],dp[i-1][k]) 1<k<j
dp[i][j]表示 前 j 个数分成 i 组的最大值 ,其中,第 J 个数包含在分好的组里面。
可以用滚动数组 将上面的改成一维的。
View Code
#include<stdio.h> #include<string.h> #define INF 9999999 #define max(a,b)(a)>(b)?(a):(b) int a[1000007]; int dp[1000007]; int pre[1000007]; //dp[i][j]=max(dp[i][j-1]+num[j],dp[i-1][k]+num[j]) int main() { int i,j,n,m,k,tmp; while(scanf("%d%d",&m,&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); memset(pre,0,sizeof(pre)); for(i=1;i<=m;i++) { tmp=-INF; for(j=i;j<=n;j++) { dp[j]=max(dp[j-1]+a[j],pre[j-1]+a[j]); pre[j-1]=tmp; tmp=max(tmp,dp[j]); } } printf("%d\n",tmp); } return 0; }