题意:一个数列,我们可以把他分成若干段,每段的值为最大值减去最小值,问最大的值和为多少
思路:肯定是单调的放在一起,那么峰值该如何处理,要么放在前面段,要么后面段,如: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 }