POJ1821 Fence
传送门
这道题是一道很好的单调队列优化DP的例子。
题目大意是有n个工人,每个人可以粉刷一段长度不超过l[i]的墙,如果一个人粉刷了那么他必须要粉刷第s[i]块墙,一个人粉刷一块墙能得到p[i]的钱,求所有工人得到的钱的最大值。
我们首先把所有工人按s[i]排序,这样方便我们线性DP。
考虑DP,用dp[i][j]表示前i个工人刷j块的得到的钱的最大值,那么我们分类讨论,首先是一个人不刷和一块墙不刷的情况,那么就有dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
之后,我们考虑这个工人刷墙的情况。因为这个人必须要刷s[i],那这个人的转移必然是从s[i] - l[i] ~ s[i]这一段转移过来的。否则的话就成了不合法情况。那么就有dp[i][j] = max{dp[i-1][k] + (j - k) * p[i]} (s[i] - l[i] <= k <= s[i])
这个式子我们朴素的做法是先枚举i,对于每一个工人i,枚举它粉刷的块数j,之后再枚举转移的范围。不过这样会超时,我们考虑优化。我们发现如果把j,k分离出来,那么对于每一个j(状态),它对应的j * p[i]是一个定值,只有内部的式子随着k(决策)的变化而改变,而且其实对于每一个j,有很大一部分的可选取的决策区间是重复的。
说到这里,我们就想到用单调队列维护啦!!那么我们的想法就是,对于每一个工人,我们首先把s[i] - l[i] ~ s[i]这一段区间之内的所有决策压入单调队列,之后随着j的增加,所能选取的k的区间左端点随之变大。也就是说实际上,我们只要维护一段左端点变大,右端点不动的区间最大值就可以了。
所以一般来说,单调队列优化DP的套路就是,如果一个DP方程能被拆成每一个状态都是从一个决策区间中选取最优的转移,然后决策区间随着状态变化左右端点变化,而且有大量重复,我们就可以先拆分式子,拆成内层只与决策有关,这样直接用单调队列维护决策的极值,就省去了一层循环,优化了时间。
看一下代码。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include<set> #include<queue> #define rep(i,a,n) for(int i = a;i <= n;i++) #define per(i,n,a) for(int i = n;i >= a;i--) #define enter putchar('\n')using namespace std; typedef long long ll; const int M = 10005; const int INF = 1000000009;int read() {int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op; }struct worker {int l,p,s;bool operator < (const worker &g) const{return s < g.s;} }a[105];int n,k,dp[105][20005],q[20005],head,tail;int calc(int i,int x) {return dp[i-1][x] - x * a[i].p; }int main() {n = read(),k = read();rep(i,1,k) a[i].l = read(),a[i].p = read(),a[i].s = read();sort(a+1,a+1+k);rep(i,1,k){head = 1,tail = 0;rep(j,max(0,a[i].s-a[i].l),a[i].s-1){while(head <= tail && calc(i,q[tail]) < calc(i,j)) tail--;q[++tail] = j;}rep(j,1,n){dp[i][j] = max(dp[i-1][j],dp[i][j-1]);if(j >= a[i].s){while(head <= tail && q[head] < j - a[i].l) head++;if(head <= tail) dp[i][j] = max(dp[i][j],calc(i,q[head]) + j * a[i].p);}}}printf("%d\n",dp[k][n]);return 0; }
转载于:https://www.cnblogs.com/captain1/p/9929440.html
POJ1821 Fence相关推荐
- 【POJ1821】Fence
单调队列优化dp 我们将每个人的s值排序,这样我们就能保证当前这个人刷的木板一定在上一个人之后,我们就能进行线型dp 定义f[i][j]表示前i个人刷前j个木板获得的最多报仇,那么有 第i个人不工作, ...
- 运维企业专题(10)RHCS集群工具——FENCE搭建、高可用服务配置详解
前言:FENCE工具的原理及作用 FENCE设备是RHCS集群中必不可少的一个组成部分,通过FENCE设备可以避免因出现不可预知的情况而造成的"脑裂"现象,FENCE设备的出现,就 ...
- Docker fence
docker的fence是通过docker服务端的api来关闭container的. 目前fence docker还没有加到epel库中, 所以在centos或rhel中使用, 需要从src编译. w ...
- CFCC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence
http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...
- TZOJ 2569 Wooden Fence(凸包求周长)
描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...
- [BZOJ1724][Usaco2006 Nov]Fence Repair 切割木板
1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1272 Solved: ...
- Linux的企业-Mfs高可用corosync+pacemaker+fence+iscci
一.配置环境 Redhat6.5 Server1:172.25.50.1 master corosync+pacemaker Server2:172.25.50.2 master corosync+p ...
- 276. Paint Fence
题目: There is a fence with n posts, each post can be painted with one of the k colors. You have to pa ...
- 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops
P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点 ...
最新文章
- 第五章Bookstrap
- mac os系统使用Visual Studio Code打开浏览器查看HTML文件
- 发福利了|最近发现深圳有一家公司提供的叫8ms的GUI平台不错,好用,最主要所有功能都是免费的
- Spring mvc注解方式使用事务回滚
- [渝粤教育] 四川大学 药用植物学 参考 资料
- 先对齐再融合,Salesforce Research提出ALBEF,用动量蒸馏进行多模态表示学习!多个下游任务性能SOTA!...
- 微信公众号开发之授权获取用户信息
- 【Linux】Linux的常用远程工具
- 深入浅出学Spring Data JPA
- Ecliplse安装tomcat插件
- 与postman的第一次亲密接触
- 最长公共子序列问题解析
- Android之四大组件、六大布局、五大存储
- SQL往表里添加字段
- windows10中最强大王爽汇编语言学习环境
- 南京大学俞扬教授:强化学习真实环境不好用?那就模拟器来凑!
- 使用ffmpeg从视频中提取纯音频纯视频
- 移动通信客户价值数据挖掘分析实战
- 2021年美容师(初级)免费试题及美容师(初级)模拟试题
- 基于反射实现的一个观察者模板
热门文章
- Adobe PhotoShop(PS) for Mac 如何隐藏切片框?
- Linux 命令之 chmod -- 改变文件或目录权限
- HH SaaS电商系统的商品关联版式功能模块设计
- js如何获取jwt信息_谈房地产公众号如何涨粉?一篇文章让你轻松获取信息
- html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...
- python中自带的模块_python中的模块详解
- 账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...
- java反向映射_opencv 直方图和直方图反向映射
- mysql数据库改成支持中文_修改Mysql编码支持中文
- mysql 安装盒子_Windows2008 装 MySQL 问题