Peter算法小课堂—动态规划斜率优化

大家来到这一堂课,就说明大家已经学过函数了

直线方程:y=kx+b

大家可以算一算。

其实,在数学上,这玩意要分类讨论

那么,这唯一的交点就是我们要背出来的

直线最值

这像一个分段函数

其实,只有部分直线能提供最小值,另外的,就可以省略

当然,最大值也一样。

看一下太戈编程第2627题

题目

在平面直角坐标系里,横坐标为x,纵坐标为y。有n条直线,第i条直线的形式为:y=b[i]+k[i]*x。其中整数b[i]为截距,整数k[i]为斜率。已知k[i]随着i的增加而减小。另外有m个从小到大排布的横坐标,第i个为x[i]。请求出在每个横坐标位置上各个直线的纵坐标最小值是多少?(纯数学)

暴力

struct Line{ll b,k;} lines[N];
int main(){ll n,m;cin>>n>>m;for(ll i=1;i<=n;i++) cin>>lines[i].b;for(ll i=1;i<=n;i++) cin>>lines[i].k;for(ll i=1;i<=m;i++) cin>>x[i];for(ll i=1;i<=m;i++){ans[i]=INF;for(ll j=1;j<=n;j++){ans[i]=min(ans[i],lines[j].b+lines[j].k*x[i]);}}for(int i=1;i<=m;i++) cout<<ans[i]<<" ";return 0;
}

时间复杂度不太行

优化

根据前面的分析,

但是,这好像只能做到常数级别的优化

注意:斜率递减

2号和0号的节点在2号和1号节点左侧,那么说明,1号线是废线,可以省略。

做之前,要做准备工作

struct Line{ll b,k;} lines[N];
ld X(ll u,ll v){return -(ld)(lines[u].b-lines[v].b)/(lines[u].k-lines[v].k);
}

然后,我们维护一个队列,里面是可能参与最小值的直线编号

ll l=1,r=1;
for(ll i=1;i<=n;++i){while(r-l>=2&&X(i,q[r-1])<X(q[r-1],q[r-2])) r--;q[r++]=i;
}

筛完了,剩下一个上凸轮廓。那么,一条直线只会提供一部分最小,之后的我们称之为“过气的直线”

假设现在有两条直线l,l+1,程序运行到x[i]。当x[i]在交点右侧时,l+1提供最小;当x[i]在交点左侧时,l+1不能提供最小。

for(ll i=1;i<=m;++i){while(r-l>=2&&X(q[l],q[l+1])<x[i]) ++l;int j=q[l];ans[i]=lines[j].b+lines[j].k*x[i];
}

书籍叠放1

题目

你有n本书,编号1到n,需要分几堆叠放在桌面上。每本书的正面都是一个长方形,共四条边,左右两侧边长对应长方形的长度,上下两侧边长对应长方形的宽度。第i本书的长度为h[i],宽度为w[i]。你可以选择任意几本书分出任意的堆数。但是,叠放的时候要注意,每本书两两之间都保持上下左右四条边平行,不能旋转。每组叠放好的书都会在桌面上占据一定的面积。例如我们将3本书叠放在一堆里:第一本长度为1宽度为4,第二本长度为2宽度为3,第三本长度为3宽度为2,这三本占据的面积为长度为3宽度为4的长方形面积,也就是3*4=12。

目前,已知你的书籍满足一种特殊顺序:你发现随着编号i增加,书的长度h[i]增加,宽度w[i]减少。请问,经过合理叠放后,总体占据的面积最小是多少?

这是一道dp题,可以用朴素

朴素

cin>>n;
for(ll i=1;i<=n;i++) cin>>bk[i].h>bk[i].w;
for(ll i=1;i<=n;++i){f[i]=bk[1].w*bk[i]*h;for(ll j=1;j<i;++j)f[i]=min(f[i],f[j]+bk[j+1].w*bk[i].h);
}

优化

这个看起来像直线最值吗

解释完毕

索道选址II

题目描述

lester的老家有一个著名的旅游景点:大牛山。据说爬完就能成为C++大牛,所以游客不断。从山脚到山顶共有n个景点,排成一条直线。山顶为景点n,并且只有这一条登山路线orz。由于山太高,当地政府决定架设若干条索道站点。索道站点山上某个景点,并且到山顶(景点n)是必须有索道站点的。在景点i修建索道站点的花费为Ai。对于没有索道直达的景点,游客会乘坐高于该景点且最近的一个索道站点,然后从该站点向下走到目的地。步行游客会产生一定的不满意度,值等于索道站点与目的地编号之差。你可以认为想去每个景点的游客人数是相同的,例如索道站点在景点3,6,则去景点4需要先到景点6,然后向下走到景点4,不满意度为6-4=2。lester既不想花太多钱,又不愿意积累太多的不满意度。注意:游客出发的位置可以理解为在0号,而不是1号。他希望求一种折衷方案,使得花费与不满意度总和最小。

f[i]表示用前i个选址覆盖前i个景点最小代价,且上一段为j。则不满意度为

也就是j+1加到i-1。

最后,我们以-j为斜率,f[j]+1/2*(j+1)*j为截距画直线

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

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

相关文章

支付牌照7000万出让:成都摩宝以1.29亿挂牌价出让60.33% 股份

重庆中渝兴拍科技有限公司受重庆力帆控股有限公司委托于2024年04月26日10时至2024年04月27日10时止在淘宝网阿里资产交易平台对力帆持有成都摩宝网络科技有限公司60.332806%股权转让进行公开拍卖活动&#xff0c;起始价为129,000,000元。 相关情况如下&#xff1a; 成都摩宝网…

docker-compose yaml指定具体容器网桥ip网段subnet

docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网&#xff0c;这时候可以更改yaml指定subnet 宿主机内网一般是192**&#xff0c;这时候容器可以指定172* version: 3.9 services:coredns:image: coredns/coredns:1.10.0container_name: coredns…

详解Qt添加外部库

在Qt项目中添加外部库是一项常见任务&#xff0c;无论是静态库还是动态库都需要正确的配置才能让项目顺利编译链接。以下是详细步骤和不同场景下的配置方法&#xff1a; 方法一&#xff1a;手动编辑.pro文件 添加头文件路径&#xff1a; 在Qt项目中的.pro文件中使用INCLUDEPAT…

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…

【YOLOv9改进[损失函数]】使用结合InnerIoU和Focaler的各种损失函数助力YOLOv9更优秀

目录 一 回归损失函数&#xff08;Bounding Box Regression Loss&#xff09; 1 Inner-IoU 2 Focaler-IoU&#xff1a;更聚焦的IoU损失 二 改进YOLOv9的损失函数 1 总体修改 ① utils/metrics.py文件 ② utils/loss_tal_dual.py文件 2 各种机制的使用 ① 使用结合Inn…

ActiveMQ 02 常用API

Active MQ 02 常用API 事务 session.commit(); session.rollback();用来提交/回滚事务 Purge 清理消息 签收模式 签收代表接收端的session已收到消息的一次确认&#xff0c;反馈给broker ActiveMQ支持自动签收与手动签收 Session.AUTO_ACKNOWLEDGE 当客户端从receive…

【01背包】滚动数组优化实现一维01背包DP(对比朴素写法)

01背包 代码 背包问题的滚动数组优化版本建议在完全弄懂了普通的二维01背包问题后再进行食用&#xff0c;不然会出现消化不良的症状… 我们可以将背包问题中DP数组的下标看作成两个集合 下面对比两种不同实现方法的区别&#xff1a; 朴素二维DP版本 使用dp[不超过i的物品集合]…

全量知识系统 程序详细设计 之 三种“活物” 之1(QA百度文库 )

Q1. 今天聊聊 全知系统中 三种“活物”。先从他们的一个简单描述开始&#xff1a;自主&#xff1a;计算机“集群”的“沉”与“浮”自然&#xff1a;AI “众生”的“世”和“界”自由&#xff1a;人类 “公民”的“宇”或“宙” 这是一个非常有趣且深刻的主题&#xff0c;将全…

2024年MCN商业模式运营体系行业发展分析

【干货资料持续更新&#xff0c;以防走丢】 2024年MCN商业模式运营体系行业发展分析 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 mcn运营资料包&#xff08;完整资料包含以下内容&#xff09; 目录 MCN机构运营方案的概要&#xff1a; 一、MCN机构定位与目…

关于java分页功能以及传参规范

不用插件 //当前页码private static final Integer currentPage 2;//设置每页个数private static final Integer pageSize 5;Testpublic void test8() {//手写一个分页测试&#xff0c;不用插件List<Integer> list new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7…

Docker 国内镜像

Docker 国内镜像 安装好Docker/Docker Desktop后&#xff0c;其registry server是默认指向https://hub.docker.com的。在国内该hub源访问速度异常慢&#xff0c;可以通过切换至国内镜像仓库来解决这一问题。 sudo vi /etc/docker/daemon.json 添加以下内容&#xff1a; { “re…

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…

Android-NDK的linux交叉编译环境

NDK工具包下载 NDK 下载 | Android NDK | Android Developers https://github.com/android/ndk/wiki/Unsupported-Downloads 以android-ndk-r26c下载为例&#xff0c;下载后将压缩包解压至/usr目录下 CMakeLists编译选项设置 编译平台变量判断条件中增加一下android条件…

【HDFS】DirectoryScanner与append操作对副本状态判定是否存在冲突?

结论: 不存在问题。 DirectoryScanner周期性地运行,扫描整个DN磁盘上的块与内存里的块做比较。 删除那些内存里没有的但是在磁盘上存在的块, 处理重复块等等。 最近在更细粒度化DN锁。在看到ReplicaMap#replicas方法时,阅读相关代码。 发现DirectoryScanner#scan 与appen…

ubuntu下man手册 查不到 pthread_mutex_lock等系列函数用法的问题

问题 在ubuntu系统中无法man到 pthread_mutex_lock pthread_mutex_trylock pthread_mutex_unlock等函数 $ man pthread_mutex_lock 没有 pthread_mutex_lock 的手册页条目解决方式 输入以下命令 sudo apt-get install manpages-posix manpages-posix-dev 然后输入密码 再次m…

Hive和Pig有什么区别吗?

尽管Hive和Pig都是用于处理大数据的Hadoop生态系统的工具&#xff0c;但它们之间的主要目标和使用方法有很大的差异。以下是对两者的一些比较&#xff1a; 数据处理&#xff1a;Hive更像是一个用于进行数据分析的工具。它提供了一种名为HQL的查询语言&#xff0c;语法类似于SQL…

MobaXterm无法登陆oracle cloud的问题

问题 我在oracle cloud上创建实例的时候&#xff0c;只能使用密钥的方式登陆&#xff0c;当时下载了私钥文件。实例创建好以后&#xff0c;在mobaxterm上使用这个私钥文件无法登陆 排查 尝试使用mobaxterm的keygen&#xff0c;把私钥文件转成ppk格式&#xff0c;还是不行。…

高中数学:三角函数-同角与异角的三角函数关系

一、同角三角函数关系 1、基本公式 知一求二 2、快速求值方法 重点掌握辅助三角形方法 3、题型 3.1、一次式整式求值 sinα和cosα指数是一次的求值&#xff0c;建议用辅助三角形方法 例题 3.2、一次式分式求值 分子、分母同除以sinα或者cosα 例题 3.3、二次式…

区块链安全-----接口测试-Postman

Postman是一款支持http协议的接口调试与测试工具&#xff0c;其主要特点就是功能强大&#xff0c;使用简单且易 用性好 。无论是开发人员进行接口调试&#xff0c;还是测试人员做接口测试&#xff0c;Postman都是我们的首选工具 之一 。 更早的接入测试&#xff0c;更早的发现问…

C++ 类型推导Auto及decltype

目录 auto decltype decltype 和 auto 是 C11 及其后续版本中引入的两个关键字&#xff0c;它们都用于自动类型推导&#xff0c;但在使用和行为上有一些重要的区别。 auto auto 关键字在 C 中用于自动类型推导。编译器会根据初始化表达式自动推断变量的类型。auto 关键字使代…