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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring Security和jdbc的Spring Boot

Spring安全性是一个很棒的框架&#xff0c;可节省开发人员的大量时间和精力。 此外&#xff0c;它还具有足够的灵活性&#xff0c;可以自定义并满足您的需求。 使用JDBC和Spring Security非常容易&#xff0c;并且许多操作是自动化的。 这将是一个最小的展示。 gradle文件包含…

map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

不知道最近有没有被一道Java面试题刷爆朋友圈&#xff0c;Spring框架的循环依赖如何解决。我收到了不少粉丝的提问&#xff0c;在了解到之后&#xff0c;也去网上查询了一些资料&#xff0c;自己也询问了身边的同事&#xff0c;总结出以下几个方面&#xff0c;今天就和我来看一…

调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载&#xff0c;为我们获取互联网资料提供了一个强有力的工具&#xff0c;它可以争取最大的带宽&#xff0c;获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等&#xff0c;后来许多传统“多线程断点续传类”软件&#xff0c;也增加了对的支持&#xff0c;…

详解虚拟机中为Linux添加硬盘

Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法&#xff0c;因为大多数初学者习惯使用虚拟机&#xff0c;这里以在Vmware虚拟机中实现Linux添加硬盘的具体步骤来详细介绍说这个问题。 Vmware中为linux增加硬盘 1. 在vmware的setting中为虚…

vue 常用功能和命令

1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init webpack your-project-name # 安装依赖 $ npm install # 进入项目 $ cd your-project-name # 开发版本打包并运行 $ npm run dev# 线上环境整个项目打…

项目管理最佳实践方法_项目管理:控制项目进度最佳实践

5分钟站立会议5 MinutesStand-up Meeting&#xff08;5分钟站立会议&#xff09;是实践中项目进度管理的好办法。5分钟站立会议时&#xff0c;项目团队成员在固定时间&#xff08;如每天上午8:30&#xff5e;8:35&#xff09;、固定地点&#xff0c;每天站着围在一起&#xff0…

《海龟交易法则》经典梳理

序言&#xff0c;第一&#xff5e;第三章 海归交易法则序言本书是历史上最好的5本交易学著作之一的理由&#xff1a;1&#xff0c;重要的不是交易系统而是交易者贯彻交易系统的能力。2&#xff0c;用浅显易懂的语言阐述行为金融学的某些原理如何用于交易和影响交易。3&#xff…

Unix下C程序内存泄漏检测工具Valgrind安装与使用

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward&#xff0c;他于2006年由于在开发Valgrind上的工作获得了第二届Google-OReilly开源代码奖。 Valgrind遵守GNU通用公共许可证条款&#xff0c;是一款自由软件。 官网…

hibernate保存失败_Hibernate:保存与保存并保存或更新

hibernate保存失败save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题&#xff0c;就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种通过save &#xff0c; saveOrUpdate和persist等方法将对象保存…

BZOJ 2957 楼房重建-线段树

这个题最主要的是解决一个统计答案的问题。 首先我们注意到&#xff0c;只要考虑右区间的答案统计就好了。 记左区间的最大值为K&#xff0c;当前右区间为P。 我们把当前右区间又分成两个子区间&#xff0c;s1,s2。 那么如果s1的最大值比K小&#xff0c;那么显然只要递归处理s2…

matlab 移动平均_两所高校被禁用MATLAB背后,是工业设计能力之争

不管是MATLAB&#xff0c;还是EDA&#xff0c;都指向了中国核心工业软件缺失的问题。 作者&#xff5c; Decode 邮箱&#xff5c;oudibjoutlook.com来源丨人民数字与品玩联合出品一款工科软件&#xff0c;最近成为科研界议论的焦点。2020 年 6 月 6 日开始&#xff0c;哈尔滨工…

MySQL 当记录不存在时insert,当记录存在时update

MySQL 当记录不存在时insert&#xff0c;当记录存在时更新 网上基本有三种解决方法。 第一种&#xff1a; 示例一&#xff1a;insert多条记录 假设有一个主键为 client_id 的 clients 表&#xff0c;可以使用下面的语句&#xff1a; INSERT INTO clients (client_id, client_na…

如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

英文原文&#xff1a;How to Detect Memory Leaks Using Valgrind memcheck Tool for C / C 系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统&#xff0c;你就需要面对越多的内存问题。有时这些问题非常琐碎&#xff0c;而更多时候它会演变成一个…

如何在Activiti中使用瞬态变量

我们昨天发布的Activiti v6 Beta3中已经加入了一个非常需要的功能-临时变量。 在本文中&#xff0c;我将向您展示一个示例&#xff0c;该示例说明如何使用瞬态变量来覆盖一些以前不可能&#xff08;或最佳&#xff09;的高级用例。 到目前为止&#xff0c;Activiti中的所有变量…

python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?

今天用Python求解「羊车门」经典的概率问题,对概率学基础和Python语法的灵活运用有所收货.本次「羊车门」求解过程采用的是:穷举法计算概率已验证概率学基础理论.期间重点借鉴了奥卡姆剃刀的博客和 南葱&#xff1a;「羊车门」经典概率题中不换门选中车的概率是多少&#xff1f…

非标协议外设LCD1602

概述 LCD1602 &#xff08; Liquid Crystal Display &#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符 (16 列两行) 引脚说明 第 1 脚 : VSS 为电源地 第 2 脚 : VDD 接 5V 正电源 第 3 脚 : VL 为液晶显示器对比度调整端 , 接正电源…

50: Luogu P4568 分层图

分层图最短路模板 #include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> #include <queue> #include <cstring>using namespace std;const int M 2e6 5e5 10;#define gc getchar() inline int read() {int x 0…

C++编程笔记:dll的生成与使用

1.动态链接库&#xff08;dll&#xff09;概述 没接触dll之前觉得它很神秘&#xff0c;就像是一个黑盒子&#xff0c;既不能直接运行&#xff0c;也不能接收消息。它们是一些独立的文件&#xff0c;其中包含能被可执行程序或其他dll调用来完成某项工作的函数&#xff0c;只有在…

如何通过IP地址分辨公网、私网、内网、外网

如何通过IP地址分辨公网、私网、内网、外网内、外网是相对于防火墙而言的&#xff0c;在防火墙内部叫做内网&#xff0c;反之就是外网。在一定程度上外网等同于公网&#xff0c;内网等同于私网。地址为如下3个区域就是处于私网&#xff1a;1&#xff1a;10.*.*.*2&#xff1a;1…

python画动态表情包_真香!一行Python代码,帮你制作小姐姐的表情包,靠谱吗?...

原标题&#xff1a;真香&#xff01;一行Python代码&#xff0c;帮你制作小姐姐的表情包&#xff0c;靠谱吗&#xff1f;(我的IU女神)对于小姐姐的动态表情包&#xff0c;相必我们大多数人都不会拒绝&#xff0c;而且都会选择默默的将其收藏(不要问我怎么知道的)&#xff0c;一…