首页 > 其他 > 详细

codeforces prblem 484 D

时间:2017-07-28 21:38:14      阅读:234      评论:0      收藏:0      [点我收藏+]

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

思路:肯定是单调的放在一起,那么峰值该如何处理,要么放在前面段,要么后面段,如: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

原文:http://www.cnblogs.com/hhxj/p/7252472.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!