1. 程式人生 > >【DP】三校聯考1017T3

【DP】三校聯考1017T3

題意:

在這裡插入圖片描述

分析:

考場上這題做了我兩個小時。。。果然第一步都錯了。。。
首先,所謂的絕對值其實可以用最優性忽略!!!!
即:|a-b|=max(a-b,b-a)
所以,不必考慮到底誰大誰小,在最優策略中,一定是合法的。

然後就很簡單了:每一個位置的貢獻分別可能為2,0,-2(開頭末尾可能為-1,1)

一段連續的2或-2就是一段。這麼搞一下DP就行了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define SF scanf
#define PF printf
#define MAXN 30010 #define MAXK 210 using namespace std; int dp[MAXK][5]; int n,k; int main(){ freopen("optimization.in","r",stdin); freopen("optimization.out","w",stdout); SF("%d%d",&n,&k); memset(dp,0xC0,sizeof dp); for(int i=0;i<4;i++) dp[0][i]=0; int x; for(int i=1;i<=n;i++){ SF
("%d",&x); for(int j=k;j>=1;j--){ int tims=2-(j==1||j==k); dp[j][0]=max(dp[j][0],dp[j-1][3])+tims*x; dp[j][1]=max(dp[j][1],dp[j][0]); dp[j][2]=max(dp[j][2],dp[j-1][1])-tims*x; dp[j][3]=max(dp[j][3],dp[j][2]); if(j!=1&&j!=k){ dp[j][1]=max(dp[j][1],dp[j-1][1]); dp[
j][3]=max(dp[j][3],dp[j-1][3]); } } } PF("%d",max(dp[k][1],dp[k][3])); }