1. 程式人生 > >kuangbin專題十二 基礎DP1【從入門到熟練】【9+1題】

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