从第二个数字开始,每个可以不翻转 或 和前一个一起翻转
用f[i][1]表示翻转,f[i][0]表示不翻转
构建一棵二叉树形象化展示
第三个数字不翻转 直接比较第二个数字 小的分支删去
第三个数字翻转,比较翻转第二个数字后的大小,小的舍去
两个灰色框就是每个数字需要保存的状态
状态状态转移方程:f[i][0]=max(f[i-1][0],f[i-1][1]+a[i]
f[i][1]=max(f[i-1][0]-2*a[i-1],f[i-1][1]+2*a[i-1])+a[i]
代码如下:
#include<bits/stdc++.h>
#define N 100010
using namespace std;
long long a[N];
long long f[N][2];
int main()
{
int m;
cin>>m;
while(m--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
f[2][0]=a[1]+a[2];
f[2][1]=-(a[1]+a[2]);
for(int i=3;i<=n;i++)
{
f[i][0]=max(f[i-1][0],f[i-1][1])+a[i];
f[i][1]=max(f[i-1][0]-2*a[i-1],f[i-1][1]+2*a[i-1])-a[i];
}
cout<<max(f[n][0],f[n][1])<<endl;
}
return 0;
}