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 经典DP+状态压缩

1024. 视频拼接 dp

HDU1024(DP)

hdu1024 Max Sum Plus Plus (Dp)

hdu 1024 Max Sum Plus Plus(简单dp)

HDU 1024 Max Sum Plus Plus --- dp+滚动数组