hdu1024线性dp
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1024线性dp相关的知识,希望对你有一定的参考价值。
/* dp[i][j]表示取第i个数时分成了j块 要么是将第i个数加入j块中的最后一块,要么是自成一块,加上前面j-1块的和 状态转移方程: dp[i][j]=max(dp[i-1][j]+a[i],max{dp[0][j-1]...dp[i-1][j-1]}) 枚举时j为外层循环,i为内层循环, 用滚动数组压缩j,再记录上一轮的dp[0..i][j]的最大值即可 */ #include<bits/stdc++.h> using namespace std; #define maxn 1000005 int dp[maxn],pre[maxn],a[maxn],m,n; int main(){ while(scanf("%d%d",&m,&n)==2){ memset(dp,0,sizeof dp); memset(pre,0,sizeof pre); for(int i=1;i<=n;i++)scanf("%d",&a[i]); int Max; for(int j=1;j<=m;j++){ Max=-0x7fffffff;//用来维护本层的最大值 for(int i=j;i<=n;i++){ dp[i]=a[i]+max(dp[i-1],pre[i-1]);//要么加入原有的j组,要么新开一组 pre[i-1]=Max;//上一轮的i-1在用过之后才能更新 Max=max(Max,dp[i]);//把当前的dp[i]更新进Max } } int ans=-0x7fffffff; for(int i=m;i<=n;i++) ans=max(ans,dp[i]); printf("%d ",ans); } return 0; }
以上是关于hdu1024线性dp的主要内容,如果未能解决你的问题,请参考以下文章
hdu1024 Max Sum Plus Plus (Dp)