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; }
以上是关于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!