浅谈斜率优化

斜率优化

如果对于方程形如这样的

我们不能对其进行比较有效果的优化,因为它的转移,涉及到了关于i和关于j的一些数组,这时我们就需要用斜率优化了。

通常我们令k<j<i,且用j来更新F[i]比用j优。则有

并且我们都可以化成如下形式,X[j],Y[j]指只关于j的数,X[k],Y[k]亦之

我们可以根据这个式子,来优化DP。这大概就是斜率优化的主要思想

实践出真知,让我们看一下HDU3507

很容易可以推出状态转移方程

令k<j<i,那么就可以得到

移项可得

如果我们令Y[i]=F[i]+A[i]²,X[i]=A[i],那么可以转化成如上形式

优化DP

根据刚才的推算,可以发现,要是满足这个条件的转移,选j一定比k要优。

我们抽象的把X[i],Y[i]想象成平面上的点,那么这个式子所表示的含义就是两个点所连成的这条线的斜率。

但是这个斜率又是怎么样的呢?

我们令g(i,j)表示i点和j点的斜率(上面式子的左边)。假设g(i,j)<g(j,k)。①如果g(i,j)<F[i](这个F[i]斜率式子右边的F[i])那么i一定比j优,则j不必选。②如果g(i,j)>F[i],那么j比i优,但是k又比j优,还是不选j。

总结出来,如果g(i,j)<g(j,k),那么j就是废物,可以T掉。

我们发现,这种情况就是

那么最后剩下的图形,就是一个下凸包壳,也就是斜率单调

优化实现

我们就例题而言

维护一个单调队列p.get为斜率

表示存的可能为答案的点。因为我们要维护下凸包的性质,必须满足get(p[tail-1],p[tail])>get(p[tail],i)

我们根据斜率式子,队首必须满足get(p[head],p[head+1])<2A[i]

因为斜率越小越优,所以每次选队首。

大致可以有如下代码:

while (head<tail) and (get(p[tail-1],p[tail])>get(p[tail],i)) do dec(tail);

加入新增可供转移的节点

while (head<tail) and (get(p[head],p[head+1])<...) do inc(HeaD)

动态规划转移
时间: 2024-08-30 12:25:03

浅谈斜率优化的相关文章

浅谈网站优化六步骤

1.分析关键词 这是进行SEO最重要的一环,关键词分析包括:关键词关注量分析.竞争对手分析.关键词与网站相关性分析.关键词部署.关键词排名预测. 2.网站架构分析 网站结构符合搜索引擎的蜘蛛喜好则有利于SEO.其中网站架构分析包括:剔除网站架构不友好设计.尽量使用树状目录结构.网站导航与链接优化. 2.关键词布局 SEO不仅仅只让网站首页在搜索引擎有好的排名,更为重要的是让网站的每个页面都带来一定流量.所以我们要为每个页面单独建设独一无二的页面主题(title,description)以及页面正

浅谈PHP优化顺序

开发工程中我们可能会为自己的编程优化步骤感到困惑,不知该从何做起,这里我也结合相关资料和自己的经验,简要谈谈PHP优化顺序,望网页们给予补充和改进.1.代码优化  代码优化就是是平时写代码的一些良好的习惯与技巧等等比如尽可能的静态化一个方法,加载文件竟可能给完  整路径,清楚一些相似功能函数的区别等等...2.工具优化    做数据缓存(memcacheds)和页面缓存达到页面静态化3.优化sql语句   关键字大写,使用缩: 分行格式书写sql,查询时尽量少用* : 多表查询的时候尽可能的使用

浅谈SQL优化入门:1、SQL查询语句的执行顺序

1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_

浅谈SQL优化入门:3、利用索引

0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直接就写在这里吧. 索引是众所周知的可以提高查询的速度,且针对的是具体的字段,使用方式为( 不具体指明则建立非聚集索引): CREATE INDEX <索引名> ON <表名(关系名)>; e.g. CREATE INDEX yearIndex ON movie(year); 而撤销索引

浅谈sql优化

问题的发现:      菜鸟D在工作的时候发现项目的sql语句很怪,例如 : select a.L_ZTBH, a.D_RQ, a.VC_BKDM, (select t.vc_name from tbkxx t where t.vc_code = a.vc_bkdm) vc_name, a.VC_BZ, a.L_SCLB, a.EN_ZS, a."ROWID", s."ROWID",--冗余列 decode(nvl(a.l_cjsl, 0), 0, 0, round

浅谈SQL优化入门:2、等值连接和EXPLAIN(MySQL)

1.等值连接:显性连接和隐性连接 在<MySQL必知必会>中对于等值连接有提到两种方式,第一种是直接在WHERE子句中规定如何关联即可,那么第二种则是使用INNER JOIN关键字.如下例两种方式是"等同"的. //WHERE方式 SELECT vend_name, prod_name, prod_price, quantity FROM vendors, products, orderitems WHERE vendors.vend_id = products.vend_

浅谈数据库优化之-索引

数据库索引 1.什么是索引 在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象.A)索引可以避免全表扫描.多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页.B)对于非聚集索引,有些查询甚至可以不访问数据页.C)聚集索引可以避免数据插入操作集中于表的最后一个数据页.D)一些情况下,索引还可用于避免排序操作. 当然,众所周知,虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新

浅谈页面优化

1.为什么要优化页面? 提升网页响应速度:对搜说引擎.屏幕阅读器友好:提高可读性.可维护性等. 2.如何优化? 减少请求:减少文件大小:页面性能:可读性可维护性等. (1)减少请求 图片合并(合并小图标): 减少CSS文件请求,可以将多个CSS文件合并为一个,少量CSS样式采用内联,避免import方式引入CSS文件. (2)减少文件大小 减少图片大小(选择合适格式),CSS值缩写减少CSS文件大小,压缩文件,减少标签数量. (3)可读性.可维护性 规范化,语义化,尽量避免Hack,模块化,注释

浅谈tomcat优化(内存,并发,缓存,安全,网络,系统等)

一.Tomcat内存优化 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数 JAVA_OPTS参数说明 -server 启用jdk 的 server 版 -Xms java虚拟机初始化时的最小内存 -Xmx java虚拟机可使用的最大内存 -XX: PermSize 内存永久保留区域 -XX:MaxPermSize 内存最大永久保留区域 3.配置示例:JAVA_OPTS='-Xms1024m