kuangbin专题十二 基础DP1从入门到熟练9+1题

Posted zhenghanghu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kuangbin专题十二 基础DP1从入门到熟练9+1题相关的知识,希望对你有一定的参考价值。

HDU1024 Max Sum Plus Plus

感觉这题是整个系列里难度最高的题之一?

技术分享图片
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
#define inf 2e9
#define maxnode 200000
#define ll long long
#define lowbit(x) (x&(-x))
const int mod = 998244353;
const int maxn = 1e6 + 10;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
using namespace std;

int a[maxn];
int dp[maxn][2],pre[maxn][2];//pre[i]是从合法位置到i的dp最大值

int main(){ 
    //ios::sync_with_stdio(false);
    int m,n;
    while( scanf("%d%d",&m,&n)!=EOF ){
        memset(dp,0,sizeof(dp));
        memset(pre,0,sizeof(pre));
        for(int i=1;i<=n;i++) scanf("%d",a+i);
        //前i个数找j个区间的最大和
        
        int last=0,now=1;//滚动数组
        //初始状态就是i=0的时候,都是dp[0][j]=0,那pre自然也是0

        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(j<i) continue;
                if(j==i) { dp[j-1][now]=-inf;  pre[j-1][now]=-inf; }//该子问题非法

                dp[j][now] = max(dp[j-1][now],pre[j-1][last])+a[j];
                pre[j][now] = max( pre[j-1][now],dp[j][now] );
            }
            last = !last;
            now = !now;
        }
        cout<<pre[n][last]<<endl;

    }

    
    return 0;
}
View Code

 

以上是关于kuangbin专题十二 基础DP1从入门到熟练9+1题的主要内容,如果未能解决你的问题,请参考以下文章

[kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus HDU - 1024

[kuangbin带你飞]专题十二 基础DP1 B - Ignatius and the Princess IV

算法系列学习[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana

算法系列学习状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework

算法系列学习[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping!

算法系列学习[kuangbin带你飞]专题十二 基础DP1 F - Piggy-Bank 完全背包问题