题目链接:
https://ac.nowcoder.com/acm/problem/15553
思路:
区间求和,这题用前缀和+dp写真是绝了,神奇的解题方法又增加了(萌新瑟瑟发抖)。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> using namespace std; const long long N = 2e5 + 7; typedef long long ll; ll sum[N],f1[N],f2[N]; int main() { int t ; cin >> t; while(t--) { int n,k,a; ll num = -1e12; cin >> n >> k; memset(sum , 0 , sizeof(sum) ); for(int i = 1;i <= n;i++) { cin >> a; sum[i] += a + sum[i-1]; } memset(f1 , -0x3f3f3f3f , sizeof(f1) ); memset(f2 , -0x3f3f3f3f , sizeof(f2) ); for(int i = k;i <= n - k;i++) f1[i] = max(f1[i-1] , sum[i]-sum[i-k] ); for(int i = n-k; i >= k;i--) f2[i] = max(f2[i+1] , sum[i+k]-sum[i] ); for(int i = k;i <= n - k;i++) { num = max(num,f1[i] + f2[i]); } cout << num << endl; } return 0; }