动态规划优化整理
来源:互联网 发布:sony 淘宝店推荐 编辑:程序博客网 时间:2024/06/01 22:50
1.四边形优化
m(i, j)状态方程满足:
i < j :m(i, j) = MIN {m(i, k-1) + m(k, j) + w(i, j) }
i = j: 0
i > j: INF
对于i <= i' < j <= j' 有 w(i, j) + w(i', j') <= w(i, j') + w(i', j) 则m(i, j) + m(i', j') <= m(i, j') + m(i', j) 即为满足四边形定理
令s(i, j)为对应决策变量的最大值,即m(i, j)通过s(i, j)达到最优, 并且s(i, j)最大
s(i, j) = MAX(i<k<=j) {m(i, j) = m(i, k-1) + m(k, j) + w(i, j) }
如果m(i, j)满足四边形定理, 则s(i, j) <= s(i, j+1) <= s(i+1, j+1)
于是m(i, j) = MIN(s(i, j-1) <= k <= s(i+1, j)) {m(i, k-1) + m(k, j) + w(i, j) }
2.斜率优化
此处以dp(i) = MIN{fun(k)}为例, MAX时相似
k<j<i,当计算dp(i)时, 如果j 比 k优, 则fun(j) < fun(k),化简可得
(y(j)-y(k)) / (x(j)-x(k)) < f(i)
令g(j, k) = (y(j) - y(k)) / (x(j) - x(k))
如果g(j, k) < f(i) 说明计算i时j比k更优。如果g(i, j) < g(j, k) 则j不会成为最优解
我们假设g(i, j) < f(i), 那么就是说i点要比j点优, 排除j点
如果g(i, j) >= f(i), 那么j点此时是比i点要更优, 但是同时g(j, k) > g(i, j) >= f(i)这说明还有k点会比j点更优, 同样排除j点
于是对于斜率优化做法可以总结如下:
1, 用一个单调队列来维护解集
2, 假设队列中从头到尾已经有元素a b c。那么当d要入队的时候,我们维护队列的上凸性质,即如果g(d, c)<g(c, b),那么就将c点删除。直到找到g(d, x)>=g(x, y)为止,并将d点加入在该位置中
3,求解时候,从队头开始,如果已有元素a b c,当i点要求解时,如果g(b, a) < f(i),那么说明b点比a点更优,a点可以排除,于是a出队。最后dp(i) = getDp(q[head])
3.单调队列优化
单调队列是一种严格单调的队列,可以单调递增,也可以单调递减。队首位置保存的是最优解,第二个位置保存的是次优解,ect。。。
单调队列可以有两个操作:
1、插入一个新的元素,该元素从队尾开始向队首进行搜索,找到合适的位置插入之,如果该位置原本有元素,则替换它。
2、在过程中从队首删除不符合当前要求的元素。
单调队列实现起来可简单,可复杂。简单的一个数组,一个head,一个tail指针就搞定。复杂的用双向链表实现。
用处:
1、保存最优解,次优解,ect。
2、利用单调队列对dp方程进行优化,可将O(n)复杂度降至O(1)。也就是说,将原本会超时的N维dp降优化至N-1维,以求通过。不是任何DP都可以利用单调队列进行优化呢
记住!只有形如 dp[i]=max/min (f[k]) + g[i] (k<i && g[i]是与k无关的变量)才能用到单调队列进行优化。
优化的对象就是f[k]。
- 动态规划优化整理
- 动态规划优化整理
- 整理: 动态规划---相关优化
- (动态规划整理)
- 动态规划整理(二)
- 动态规划算法整理
- 动态规划问题整理
- 动态规划整理
- 动态规划---书本整理
- ZOJ2676动态规划优化
- 动态规划 斜率优化
- 动态规划的优化
- 动态规划优化
- 动态规划的优化
- 【动态规划】【RQ478】整理队形
- 动态规划的一些整理
- 动态规划整理(转)
- NYOJ 整理图书(动态规划)
- oracle数据库的泵导入导出
- 关于阿里云服务器Linux安装Tomcat后,外网不能访问解决方案
- listview item点击无效,item焦点被强占,完美解决方案
- Markdown编辑器
- WIN10 设置或取消自动关机
- 动态规划优化整理
- java代码计算时间差,精确到 天、月、日、时、分、秒、毫秒
- mybatis逆向工程
- 如何有效管理自己电脑里的文件?
- 周期串 UVa455
- CentOS下使用crontab命令来定时执行任务
- python爬虫学习--下载图片
- IOS 原生网络请求
- mysql报错Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist