http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270
简单的线性dp,最近狂刷水题真的是。。。药丸
差值最大得话要么是峰顶要么是最小的1,不可能处在中间状态,那样显然没有峰值的贡献大,想通这一点之后方程就好写了,
dp[i][0]表示第i个数取最小值的最大代价,dp[i][1]相反。
有 dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i-1]-1);
dp[i][1]=max(dp[i-1][0]+a[i]-1,dp[i-1][1]+abs(a[i]-a[i-1]);
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 LL mod=1e9+7; 6 LL dp[50005][2]; 7 int a[50005]; 8 int main() 9 { 10 int N,i,j; 11 cin>>N; 12 for(i=1;i<=N;++i) scanf("%d",a+i); 13 dp[2][0]=a[1]-1; 14 dp[2][1]=a[2]-1; 15 for(i=3;i<=N;++i) 16 { 17 dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i-1]-1); 18 dp[i][1]=max(dp[i-1][0]+a[i]-1,dp[i-1][1]+abs(a[i]-a[i-1])); 19 } 20 cout<<max(dp[N][0],dp[N][1])<<endl; 21 return 0; 22 }