建议缩短时限

P2627 [USACO11OPEN] Mowing the Lawn G

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复杂度应该是 O(n\times k),但是原题貌似没有给出 k 的数据范围?(应该是 1\le k\le n 吧)

主要是数据太水了


by WangSiHan_2011 @ 2024-11-21 12:44:24

写一版朴素 dp。》

难绷


|