思路:
分类讨论:
1.对于交换长度为奇数的子串,偶数位上的和是不会变的。
2.对于交换长度为偶数的子串,奇偶位上的和会互换。
对于第二种情况,继续思考,会发现这是一个最大连续字段和的问题,对于前序贡献为负的情况,抛弃前序。然后所给的数组长度可能为奇数,所以
ll a[N];
int main()
{
cin >> t;
while (t--)
{
int n;
scanf("%d", &n);
ll now = 0;
f(i, 1, n)
{
scanf("%lld", &a[i]);
if (i & 1)now += a[i];
}
ll tmp1 = 0, tmp2 = 0, nowmax=0;
f(i, 2, n)
{
nowmax = max((ll)0, a[i] - a[i - 1]+nowmax);
tmp1 = max(tmp1, nowmax);
i++;
}nowmax = 0;
f(i, 3, n)
{
nowmax = max((ll)0, a[i - 1] - a[i]+nowmax);
tmp2 = max(tmp2, nowmax);
i++;
}tmp1 = max(tmp1 , tmp2);
printf("%lld\n", tmp1+now);
}
return 0;
}