这是NEERC比赛重现的签到水题,做的时候以为是贪心,各种死在最后一组数据。
看了别人的代码才知道是dp。
用d[ i ]表示前i个元素中连续k个元素的最大和。
用f[ j ]表示后n-j+1个元素中连续k个元素的最大和。
然后枚举d[ i ] + f[ i + 1 ]求最大值。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
LL arr[200000+100], sum[200000+100];
LL d[200000+100], f[200000+100];
int main()
{
int n, k;
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
{
scanf("%I64d", &arr[i]);
sum[i]=sum[i-1]+arr[i];
}
for(int i=1; i<=n; i++)
d[i]=max(d[i-1], sum[i]-sum[max(0, i-k)]);
for(int i=n; i>=1; i--)
f[i]=max(f[i+1], sum[min(n, i+k-1)]-sum[i-1]);
LL ans=0;
for(int i=1; i<=n; i++)
ans=max(ans, d[i]+f[i+1]);
printf("%I64d\n", ans);
return 0;
}