[置顶] 1D1D动规优化初步

时间:2022-02-06 20:08:58

例题一:

货物运输,大意:

给出N个点的坐标与需要你送过去的钱数(第一个点不需要钱),身上带钱的数目有最大值,由初始在的1点,按顺序经历每个点(中途可以回1点,回去钱就满了),问最小走的路程是多少(最后要回到原点),N<=50000。

观察题目,很容易写出转移方程:f[i]=min{f[j]+dis[j+1]+dis[i]+sum[i]-sum[j]}。

f[i]表示经历过前i个点并且回到原点经历的最小路程,dis[i]表示i点到原点的路程,sum[i]表示前i个点需要的总钱数。

然而这个转移是O(N)的,所以总复杂度就是O(N^2)的,50000的数据明显是不够的。

重新观察方程,可以转化为:f[i]=min{f[j]+dis[j+1]-sum[j]}+dis[i]+sum[i].

即:f[i]=min or max{a[j]}+b[i];

其中dis[i]+sum[i]==b[i]是常量,(f[j]+dis[j+1]-sum[j])==a[j]是变量,我们需要的是最小的a[j],所以用一个单调队列维护它就够了。

例题二:

玩具装箱:

P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过L。但他希望费用最小.

第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7

.in

5 4
3
4
2
1
4

.out

1


很容易发现转移方程: f[i]=min{f[j]+(i-j+sum[i]-sum[j]-L)^2}
然而这样做时间复杂度是O(N^2)的,无法解决这个问题。
有经验的人可以发现,这个转移方程可以视为:
f[i]=min{f[j]+w[j][i]},经证明后发现这个转移时满足四边形不等式的(具体证法见
http://baike.baidu.com/link?url=PR0x-4hE-M7qSJFKgIRLyO9xHK4EhbiCUTex7ppLRmG0ceilhtA54mnR8wdvP_OoVidg5oAbaxE1YwcsFUAZQK),其实实际我们可以直接打一个决策表,毕竟我们是要写朴素来对拍的。
然后有什么用呢?
这可以带给我们一个性质:决策单调性:对于i<j时,用来转移j的决策绝对不小于用来转移i的决策。
具体图表如下:
最先是最优决策是:
111111111111111111111111111111111111111111111111111111111111111111111111111
然后变成:
111111111111111111111111111111111112222222222222222222222222222222222222222
再然后变成:
111111111111111111111111111111111112222222222222222222223333333333333333333
或者 111111111111111111133333333333333333333333333333333333333333333333333333333
这样我们就可以用二分来找到它的转变点。总的来说,就是维护一个最优决策队列。
操作如下:
1.由队首向后踢非最优解出队列;
2.得到当前i的最优解;
3.将i加入队尾,期间由队尾向前踢非最优解出队列。
具体时间复杂度为O(NlogN)
例题三:
玩具装箱:
同第二题。
我们注意到,将转移方程中平方打开可以得到:(a[i]=sum[i]+i)
f[i]=min{f[j]+a[j]^2-2(a[i]-L)a[j]}+P;
当把a[j]当做x,f[j]+a[j]^2当做y,将决策j当做一个坐标时,我们可以讲转移方程转化为:
y=2kx+f[i]+P;
此时我们需要做的就是最小化截距。
此时可以发现斜率k是逐渐增大的,x也是逐渐增大的。
而对于一个固定的i,斜率k也是固定的,什么才是最小截距?
想象一条斜率固定的直线由负无穷向上平移,所碰触到得第一个点就是能转移过来的最优决策点,怎么实现呢?
同样,还是维护一个单调队列,这不过这个队列满足的是斜率单调。
具体时间复杂度为O(N)。
完美解决。

[置顶] 1D1D动规优化初步的更多相关文章

  1. &lbrack;置顶&rsqb;&NewLine; flume高并发优化——(15)中间件版本升级

    在系统平稳运行一年的基础上,为提供更好的服务,现针对java,kafka,flume,zk,统一进行版本升级,请各位小伙伴跟着走起来,不要掉队啊! 名称 老版本号 新版本号 jdk 1.7.0_25 ...

  2. &lbrack;置顶&rsqb;&NewLine; flume高并发优化——(14)解决空行停止收集数据问题,及offsets变小问题

      日志平台运行一段时间,发现日志有部分丢失,通过检查日志,发现有两个问题导致数据丢失,一个是遇到空行后,日志停止收集,还有就是kafka监控offsets时变小,通过分析代码,找到如下方法: 空行问 ...

  3. 洛谷 P2569&lbrack;SCOI2010&rsqb;股票交易(动规&plus;单调队列)

    //只能写出裸的动规,为什么会有人能想到用单调队列优化Orz 题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测 ...

  4. &lbrack;置顶&rsqb; Android开发笔记&lpar;成长轨迹&rpar;

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  5. - &gt&semi; 动规讲解基础讲解一——01背包(模板)

    作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重 ...

  6. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  7. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  8. winform窗体置顶

    winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...

  9. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

随机推荐

  1. &lbrack;IIS&rsqb;IIS扫盲&lpar;二&rpar;

    iis - IIS之Web服务器建立 第一篇 IIS之Web服务器  一.建立第一个Web站点  比如本机的IP地址为192.168.0.1,自己的网页放在D:\Wy目录下,网页的首页文件名为Inde ...

  2. ASP&period;NET MVC4 数据库连接&lpar;EF6&period;0&rpar;

    我的博客原文地址:http://www.star110.com/Note/ReadArticle/60641215331146140041.html 环境:.NET MVC4 + EF6.0 连接数据 ...

  3. poj 2528Mayor&&num;39&semi;s posters

    http://poj.org/problem?id=2528 这个题有个细节,整个区间的长度为10000000,而n最大只有1000,所以我们要进行离散化. #include<cstdio&gt ...

  4. 测试redis&plus;keepalived实现简单的主备切换【转载】

    转自: 测试redis+keepalived实现简单的主备切换 - Try My Best 尽力而为 - ITeye技术网站http://raising.iteye.com/blog/2311757 ...

  5. SpringCloud分布式微服务搭建(一)

    本例子主要使用了eureka集群作为注册中心来保证高可用,客户端来做ribbon服务提供者的负载均衡. 负载均衡有两种,第一种是nginx,F5这种集中式的LB,对所有的访问按照某种策略分发. 第二种 ...

  6. centos安装pg以及pg配置ssl

    https://blog.csdn.net/iteye_21194/article/details/82645389 https://blog.csdn.net/rudy5348/article/de ...

  7. Mac vim&OpenCurlyDoubleQuote;装逼”配置

    配置c++ 等编程语言补全等 from blog http://www.cnblogs.com/xiaobo-Linux/p/8909402.html 1. 安装 macvim brew instal ...

  8. manifest&period;xml微擎系统模块的安装文件内容

    微擎在安装或卸载模块时会根据manifest.xml生成(或删除)数据库中相应记录,并执行manifest.xml里指定的脚本. manifest.xml文件内容详细介绍如下: manifest - ...

  9. Teamwork(The second day of the team)

    梦之翼 5.20工作汇报: Master:杨灵超 产品负责人:杨家安 第一次Sprint的目标和时间: 目标:这一次的sprint我们想先做成一个可以运行的可以展示,但是功能或许还不是很完善的一个模型 ...

  10. 路由追踪:traceroute&sol;tcptraceroute

    一.工作原理 traceroute:IP路由过程中对数据包TTL(Time to Live,存活时间)进行处理.当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检验和checksum变 ...