kuangbin專題十二 基礎DP1【從入門到熟練】【9+1題】
阿新 • • 發佈:2019-01-04
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)) constView Codeint 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; }