单调队列优化dp求调,WA#8
查看原帖
单调队列优化dp求调,WA#8
653286
zhfaz123楼主2023/8/10 11:01

提交记录:这里

代码:

#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;
}

2023/8/10 11:01
加载中...