题目分析
这道题因为n达到了1e5,所以必须要优化,我们可以把所有的abs(f[i]-f[i-1])处理出来,这样因为是正负交替的,这样我们就可以求2遍最大连续子序列和就可以了。时间复杂度O(n).
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+100;
#define LL long long
LL a[maxn], b[maxn], dp[maxn];
LL Abs(LL a){
if(a < 0) a = -a;
return a;
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
for(int i = 1; i <= n; i++)
scanf("%I64d", &a[i]);
for(int i = 1; i < n; i++)
b[i] = Abs(a[i] - a[i+1]);
LL ans = -1e17, temp = 0;
for(int i = 1; i < n; i++){
if(i&1){
if(temp > 0) temp += b[i];
else temp = b[i];
ans = max(ans, temp);
}
else{
if(temp > 0) temp -= b[i];
else temp = -b[i];
ans = max(ans, temp);
}
}
temp = 0;
for(int i = 2; i < n; i++){
if(i&1){
if(temp > 0) temp -= b[i];
else temp = -b[i];
ans = max(ans, temp);
}
else{
if(temp > 0) temp += b[i];
else temp = b[i];
ans = max(ans, temp);
}
}
printf("%I64d\n", ans);
}
return 0;
}