codeforces prblem 484 D

题意:一个数列,我们可以把他分成若干段,每段的值为最大值减去最小值,问最大的值和为多少

思路:肯定是单调的放在一起,那么峰值该如何处理,要么放在前面段,要么后面段,如:1 3 4 1 ,或者 1 3 7 6

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e6+10;
 5 
 6 ll a[N],dp[N][3];
 7 
 8 int main(){
 9     int n;
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
12     for(int i=2;i<=n;i++){
13         //cout<<a[i]<<" "<<a[i-1]<<endl;
14         if(a[i]>a[i-1]){
15             dp[i][0]=max(dp[i-1][1],dp[i-1][0]-a[i-1]+a[i]);//放在前面递减的那段,还是放在当前段,当然这里的递减段也不是说肯定是递减段//
16             dp[i][1]=max(dp[i-1][1],dp[i-1][0]);
17         }
18         else {
19             dp[i][1]=max(dp[i-1][0],dp[i-1][1]+a[i-1]-a[i]);
20             dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
21         }
22     }
23     cout<<max(dp[n][0],dp[n][1])<<endl;
24 }
原文地址:https://www.cnblogs.com/hhxj/p/7252472.html