题目链接:Codeforces-788A-Functions again
先求出数列
b
:
设 dp[i][j] , j=0 表示b[i]取正时的前缀和, j=1 表示b[i]取负时的前缀和。
dp[i][j]=dp[i−1][j⊕1]+b[i]
用 odd 或 even 记录当 i−1 为奇数或偶数时且 b[i] 取正数的前缀和(即取 dp[i−1][1] )。
当 i 为偶数:
当 i 为奇数:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100007];
const ll INF=0x3f3f3f3f3f3f3f3f;
ll b[100007];
ll dp[100007][2];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=1;i<n;i++)
b[i]=abs(a[i]-a[i-1]);
dp[0][1]=dp[0][0]=0;
ll l=b[1],odd=INF,even=INF;
ll ans=0;
for(int i=1;i<n;i++)
{
dp[i][0]=dp[i-1][1]+b[i];
dp[i][1]=dp[i-1][0]-b[i];
if(i%2==0) even=min(even,dp[i-1][1]);
else odd=min(odd,dp[i-1][1]);
if(i%2==0) ans=max(ans,max(dp[i][0]-even,dp[i][1]-odd));
else ans=max(ans,max(dp[i][0]-odd,dp[i][1]-even));
}
cout << ans << endl;
return 0;
}