トピックリンク
溶液
70非常にシンプルなDP、複雑性O(NK)。
次のように式は
、[F [I] [1] = MAX(F [J] [0] + SUM [I] -sum [J])\] \ \ [F [I] [0] = MAX(F [I -1] [1]、[F
I-1] [0])\] あなたは、最適化を考慮する必要があり、キューが単調を最適化するために使用され得ることは明らかです。
現在の維持(Iは\)\の前に\(K \)番目の点\(F [j] [0 ] \) \(最大\)値を転送することができます。
Oの複雑さ(N)。
コード
#include<bits/stdc++.h>
#define N 100008
#define ll long long
using namespace std;
ll n,k,c[N];
ll f[N][2],sum[N];
int main()
{
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&c[i]),sum[i]=sum[i-1]+c[i];
ll head=1,tail=1,a[N];
a[1]=0;
for(int i=1;i<=n;i++)
{
f[i][1]=f[a[head]][0]+sum[i]-sum[a[head]];
f[i][0]=max(f[i-1][1],f[i-1][0]);
while(1)
if(f[i][0]>=f[a[tail]][0]+sum[i]-sum[a[tail]]&&tail>=head)
{tail--;}
else break;
a[++tail]=i;
while(1)
if(a[head]<i+1-k)head++;
else break;
if(tail<head)tail=head;
}cout<<max(f[n][0],f[n][1])<<endl;
}
/*
7 2
1 7 8 4 5 9 10
Ans: 34
*/