P5858

一道普通的单调队列优化动态规划

很容易得到动态规划方程:

f[i][j]=max{f[i1][k]+aij}

f[i][j]为放入i个原料,当前锅里有j个原料

这算是个暴力吧,测评可得85

对于上式中的k,其取值范围是在[j1,j+s1]

所以我很不容易想到使用单调队列优化

在知道了这个数据结构的情况下,很容易就能做出这道题来


#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

#define minn 5505

long long   a[minn];
long long   f[minn][minn];  //13107200
long long   con[minn*2];
long long   que[minn*2];

int  main()
{
	long long   n,w,s;
	long long   maxn;
	
	ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	cin>>n>>w>>s;
	
	for(long long   i=1;i<=n;i++)
	cin>>a[i];
	
//	for(int i=0;i<=n;i++)
//		for(int j=0;j<=n;j++)
//		f[i][j] = -1<<;
	
	memset(f,0xcf,sizeof(f));
	
	maxn=f[0][0];
	
	f[0][0]=0;
	
	for(long long   i=1;i<=n;i++)
	{
		int lef=1,rig=0;
		
		que[++rig] = f[i-1][w];
		con[rig] = w;
 		
		for(int k=w ;k ;k--)
		{
		
		while(lef <= rig && con[lef] > k + s - 1 ) lef++;
		
		while(lef <= rig && que[rig] < f[i-1][k-1]) rig--;
		
		con[++rig] = k-1;  	  
		que[rig] = f[i-1][k-1];
		
		f[i][k]= que[lef] + a[i] * k;
		
		}
		
		
	}
		
	for(long long   j=1;j<=w;j++)
	maxn=max(f[n][j],maxn);
	
	cout<<maxn;
}

posted @   ·Iris  阅读(725)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示