#include "cstdio"
#include "iostream"
#include "cstring"
#include "algorithm"
using namespace std;
/*题意:
给一个数列,删掉其中一个数字后,求剩下数列相邻之差的最大值。累加起来
做法:
给你一个f[]来积累前面的最大值,g[]来积累后面的最大值
最后来 比较f[],g[],还有a[i+1]-a[i-1],找出最大值
*/
int a[100010];
int f[100010];
int g[100010];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n;long long ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
f[1]=0;
for(int i=2;i<=n;i++)
f[i]=max(f[i-1],abs(a[i]-a[i-1]));
g[n]=0;
for(int i=n-1;i>=1;i--)
g[i]=max(g[i+1],abs(a[i+1]-a[i]));
for(int i=1;i<=n;i++)
{
if(i==1)
ans+=g[i+1];//因为要删掉第一个,所以要向后移动一个位子
else if(i==n)
ans+=f[i-1];//因为 要删掉最后一个,所以要向前移动个位子
else {
ans+=max(g[i+1],max(f[i-1],abs(a[i+1]-a[i-1])));
}
}
printf("%I64d\n",ans);
}
return 0;
}
数列问题 HDU 5805
最新推荐文章于 2020-06-28 21:10:19 发布