[luogu P1776] 宝物筛选 解题报告(单调队列优化DP)
2024-10-19 12:39:34
题目链接:
https://www.luogu.org/problemnew/show/P1776
题目:
终于,破解了千年的难题。小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有c[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
题解:
很容易写出状态转移方程$dp_{i,j}=max[dp_{i-1,j-w*k}+v*k],k<=c$
我们要转化为可以单调队列优化的类型
$dp_{i,j}=max[dp_{i-1,d+w*k}-v*k]+v*s,s=\lfloor \frac{j}{w} \rfloor,d=j \mod w$ 枚举k。
众所周知,dp优化的原理就是减少不必要的转移,上述这个状态转移方程就是基于发现最初始的状态转移方程里的j只能从j在模w意义下的同余系转移而得到。因而我们枚举余数d
那么如何用单调队列维护就很显然了,对于每一个余数d维护一个单调队列即可
代码
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std; const int N=4e4+;
int n,W,ans,tmp;
int dp[N],q1[N],q2[N];
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int main()
{
n=read();W=read();
for (int i=;i<=n;i++)
{
int v=read(),w=read(),c=read();
if (w==)
{
ans+=v*c;
continue;
}
c=min(c,W/w);
for (int d=;d<w;d++)//枚举余数
{
int K=(W-d)/w;//最大的整除数
int head=,tail=;
for (int k=;k<=K;k++)//枚举整除数
{
int now=dp[d+w*k]-v*k;
while (head<=tail&&now>=q1[tail]) --tail;
++tail;
q1[tail]=now;
q2[tail]=k;
while (head<=tail&&c<k-q2[head]) head++;
dp[d+w*k]=max(dp[d+w*k],q1[head]+v*k);
tmp=max(dp[d+w*k],tmp);
}
}
}
printf("%d\n",tmp+ans);
return ;
}
最新文章
- zigbee 路由节点丢失后清除 该节点的残余网络信息
- C#以管理员身份运行程序
- [转] Redis系统性介绍
- chrome浏览器关闭标签页面
- poj1026 Cipher
- 全国行政区划代码(json对象版)
- Python mix-in 组合 ~ 将类组合起来 .
- 【转】OS X Mavericks: 防止 Mac 进入睡眠 -- 不错
- python ATM购物程序
- SQL数据库的应用一(Day 24)
- 1342: [Baltic2007]Sound静音问题
- 【方法】Html5实现文件异步上传
- 201521123003《Java程序设计》第9周学习总结
- Android 开发笔记___基本适配器的使用__BaseAdapter
- jsDOM编程-拖拽层
- 解决将龙邱oled库移植到野火工程里,oled汉字无法显示问题
- 通过Beego将之前实现的短url项目实现
- 聊聊数据库~4.SQL优化篇
- Java 中的字符串转为二进制
- RabbitMQ集群简介
热门文章
- Swift - 使用CollectionView实现图片Gallery画廊效果(左右滑动浏览图片)
- spark Bisecting k-means(二分K均值算法)
- OEM:Enterprise Manager 无法连接到数据库实例 错误解决
- IPython Autoreload
- 实现两个jQuery的API(addClass、text)
- The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online J Press the Button
- LeetCode(96)Unique Binary Search Trees
- C语言-实现整数倒序输出
- IPv6地址分配
- CF859C Pie Rules 动态规划 逆推_思维题