CF1077F Pictures with Kittens(单调队列优化dp)

简单版传送门

困难版传送门


解题思路

单调队列优化dp板子题。

但是要注意一开始把dp数组初始化成极小值。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=5e3+5;
int n,k,m;
long long dp[maxn][maxn],a[maxn],ans;
int main(){
	ios::sync_with_stdio(false);
	memset(dp,-0x3f,sizeof(dp));
	cin>>n>>k>>m;
	if(n/k>m){
		cout<<-1<<endl;
		return 0;
	}
	for(int i=1;i<=n;i++) cin>>a[i];
	dp[0][0]=0;
	for(int i=1;i<=m;i++){
		deque<int> q;
		q.push_back(0);
		for(int j=1;j<=n;j++){
			while(!q.empty()&&j-q.front()>k)  q.pop_front();
			dp[i][j]=dp[i-1][q.front()]+a[j];
			while(!q.empty()&&dp[i-1][j]>dp[i-1][q.back()]) q.pop_back();
			q.push_back(j);
		}
	}
	for(int i=n-k+1;i<=n;i++) ans=max(dp[m][i],ans);
	cout<<ans;
	return 0;
}
posted @ 2021-10-09 17:10  尹昱钦  阅读(35)  评论(0编辑  收藏  举报