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

2024-04-12 23:52

本文主要是介绍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为截距画直线

这篇关于Peter算法小课堂—动态规划斜率优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898586

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,