动态规划解, 具体步骤看文章代码注释
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
int t, n, q;
ll a[maxn];
int sum[maxn];
ll dp[maxn][2];
int main()
{
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&n,&q);
for(int i = 1; i <= n; i ++)
{
scanf("%lld",&a[i]);
}
dp[0][0] = 0; //第0个无论选不选,价值都为0
dp[0][1] = 0;
for(int i = 1; i <= n; i ++)
{
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + a[i]);
//第i个选的最大值,前一个已经选了或者,前一个没选加上当前的。
dp[i][0] = max(dp[i-1][0], dp[i-1][1] - a[i]);
//第i个不选最大值,前一个不选,或者前一个选了当前应该减了
}
//这里的dp由于有增有减,所以需要开两个一起算,一个算增加,一个算减少
ll ans = -1;
for(int i = 1; i <= n; i ++)
{
ans = max(ans, max(dp[i][1], dp[i][0]));
}
printf("%lld\n",ans);
}
return 0;
}