#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
long long int x[200001], sum[200001] , p[200001], dp[200001], ddp[200001];
int main() {
int t;
cin >> t;
int i;
for (i = 1; i <= t; i++) {
int n;
int k;
memset(sum, 0, sizeof(sum));//初始化sum数组
cin >> n >> k;
int j;
int m;
for (j = 1; j <= n; j++) {
cin >> x[j];//输入数据
}
for (j = 1; j <= n; j++) {
sum[j] = sum[j - 1] + x[j];//sum[i]表示前i个数的和
}
for (j = k; j <= n; j++) {
p[j] = sum[j] - sum[j - k];//p[j]表示以j结尾的连续k个数的和
}
for (m = k; m <= n; m++) {//算前m个数中最大的连续k个数的和
if (m == k) {
dp[m] = p[m];
}
else {
dp[m] = dp[m - 1] > p[m] ? dp[m - 1] : p[m];
}
}
for (m = 2*k; m <= n; m++) {//算前m个数两段k个数的和的最大值
if (m == 2 * k) {
ddp[m] = sum[m];
}
else {
ddp[m] = ddp[m - 1] > p[m] + dp[m - k] ? ddp[m - 1] : p[m] + dp[m - k];
}
}
cout << ddp[n] << endl;
}
}
这道题其实可以画一个长串的数,然后根据算两端k个数的和的最大值的思路,从前往后走,很容易得出思路