题意:给一个公式,(1 ≤ l < r ≤ n),(1=<I<=n),和a数组,求f(l,r)的最大值
思路:令b[I] = | a[I]-a[I+1] | ,可以发现f(l,r)的最大值要么在 {b1,-b2,+b3,... ,(+ or -) bn-1},要么在{-b1,b2,-b3,b4,...,(- or +) bn-1 }中,两个序列中最大连续子序列和较大者为答案
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int maxn = 1e5+10;
int b[maxn],c[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a,a1;
scanf("%d",&a1);
for(int i=1;i<n;i++)
{
scanf("%d",&a);
if(i%2==0)
{
b[i]=abs(a-a1);
c[i]=-b[i];
}
else
{
b[i]=-abs(a-a1);
c[i]=-b[i];
}
a1=a;
}
ll Max1,Max2,sum1=0,sum2=0;
Max1=Max2=-(1<<30);
for(int i=1;i<n;i++)
{
if(sum1<=0)
sum1=b[i];
else
sum1+=b[i];
if(sum1>Max1)
Max1=sum1;
if(sum2<=0)
sum2=c[i];
else
sum2+=c[i];
if(sum2>Max2)
Max2=sum2;
}
ll ans=Max1>Max2?Max1:Max2;
printf("%I64d\n",ans);
}
}