codeforces prblem 484 D

Posted 早知如此绊人心,何如当初莫相识。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于codeforces prblem 484 D的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #484 (Div. 2)

Codeforces Codeforces Round #484 (Div. 2) E. Billiard

CodeForces484A Bits(贪心)

Codeforces Round #484 (Div. 2)

Codeforces Round #484 (Div. 2) A. Row

Codeforces Round #484 (Div. 2) B. Bus of Characters(markdowm版)