思路:其实基本上就是裸的最大连续子序列和,首先先把数组相邻的差值求出来,然后很明显就只有两种情况,正负正负正负和负正负正负正,把两种的最大值都算一遍取最大就好了。下面给代码:
#include<iostream>
#include<cmath>
#include<queue>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<utility>
#include<map>
#include<vector>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-8;
LL a[maxn], b[maxn], c[maxn];
int main(){
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%lld", &a[i]);
}
for (int i = 0; i < n - 1; i++){
b[i] = abs(a[i] - a[i + 1]);
c[i] = b[i];
if (i & 1)
b[i] = -b[i];
else
c[i] = -c[i];
}
LL ans = max(b[0], c[0]);
for (int i = 1; i < n - 1; i++){
if (b[i] + b[i - 1] > b[i])
b[i] += b[i - 1];
if (c[i] + c[i - 1]>c[i])
c[i] += c[i - 1];
ans = max(ans, b[i]);
ans = max(ans, c[i]);
}
printf("%lld\n", ans);
}