GUO120822 @ 2024-11-21 11:44:25
#include<bits/stdc++.h>
using namespace std;
/*
由于是一维,所以状态位 dp[i] 表示前 i 位的状态。
dp[i] = dp[j] + sum[i] - sum[j-1] (i - k + 1 <= j <= i)
sum 表示前缀和。
先写一版朴素 dp。
*/
typedef long long ll;
const ll inf=1e18;
const int N=1e5+10;
int n,k,i,j,t;
ll dp[N],sum[N],a[N],ma[N];
int main()
{
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
for (i=1;i<=k;i++) dp[i]=sum[i],ma[i]=sum[i];
for (i=k+1;i<=n;i++)
{
t=i-k;
dp[i]=-inf;
for (j=t;j<i;j++) dp[i]=max(dp[i],ma[j-1]-sum[j]);
dp[i]+=sum[i];
ma[i]=max(ma[i-1],dp[i]);
}
printf("%lld",ma[n]);
return 0;
}
https://www.luogu.com.cn/record/190112848
by yuanshen362 @ 2024-11-21 12:38:02
@GUO120822你896ms都要到时限了,还缩短干嘛?
况且1s已经可以卡掉暴力了。
by yuanshen362 @ 2024-11-21 12:41:33
@WangSiHan_2011额抱歉,我刚刚都没看,我以为他给的整正解。
那确实该缩短。
by WangSiHan_2011 @ 2024-11-21 12:43:25
@yuanshen362复杂度应该是
主要是数据太水了
by WangSiHan_2011 @ 2024-11-21 12:44:24
《先写一版朴素 dp。》
难绷