题意:找出四个数,ai,aj,ak,al。i<=j<=k<=l 并使(aj-ai)+(al-ak)最大。
分析:从头找两个数最大的方案,从尾找两个数最大的方案,再找到一个点求出最大值。
状态转移方程
ans=max(ans,f[i]+g[i]);求出两个和
minx=min(minx,a[i]);//找出最小值
f[i]=max(f[i-1],a[i]-minx);//用最小值求最大值
maxx=max(maxx,a[i]);//找出最大值
g[i]=max(g[i+1],maxx-a[i]);//用最大值求最大值
#include <cstdio>
#include <climits>
#include <cctype>
#include <algorithm>
using namespace std;
int t,a[100001],f[100002],g[100002];
inline int in(){
char x=getchar(); int f=1,go=0;
while (!isdigit(x)&&x!='-') x=getchar();
if (x=='-') f=-f,x=getchar();
while (isdigit(x)) go=go*10+x-48,x=getchar();
return go*f;
}
int main(){
t=in();
while (t--){
int n,minx=