提交记录:这里
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<climits>
using namespace std;
constexpr int N=5e3,M=1e5;
long long n,m,k;
long long f[N+5][N+5],a[N+5];
struct g
{
deque<int> q;long long w[N+5],k;
bool empty(){return q.empty();}
void push(int rk,long long key)
{
if(!empty()&&rk-q.front()>=k) q.pop_front();
while(!empty()&&w[q.back()]<key) q.pop_back();
q.push_back(rk);w[q.back()]=key;
}
long long get_max()
{
return w[q.front()];
}
};//单调队列,w数组用于存值
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k>>m;
for(int i=1;i<=n;i++) cin>>a[i];
if(n/k>m) cout<<-1,exit(0);//判断可行
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
f[i][j]=LONG_LONG_MIN;
for(int i=0;i<=k-1;i++) f[i][0]=0;
for(int i=1;i<=m;i++)
{
g q;q.k=k;
q.push(0,f[0][i-1]);
for(int j=1;j<=n;j++)
{
q.push(j,f[j-1][i-1]+a[j]);
f[j][i]=q.get_max();
// cout<<q.get_max()<<" ";
}
// cout<<"\n";
}//dp主体
cout<<f[n][m];
return 0;
}