动态规划——决策单调性优化DP 学习笔记

这篇具有很好参考价值的文章主要介绍了动态规划——决策单调性优化DP 学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

动态规划——决策单调性优化DP 学习笔记

决策单调性

对于最优性问题,常有状态转移方程:\(f_i = \min/\max\{f_j\dots\}\)

形象的:如果 \(i\) 的最优转移点是 \(j\)\(i'\) 的最优转移点是 \(j'\),当 \(i<i'\) 时,有 \(j\le j'\),则称该 DP 问题具有决策单调性。

即:\(i\) 单增,其最优转移点单调不减。

如何发现一个转移方程具有决策单调性?打表。

使用

一、离线决策单调性

形如:\(f(i, j) = \min\limits_{k \le j}\{f(i-1, k)+\text{cost}(k,j)\}\),转移分层.

形象的:\(f(i, j)\) 表示将前 \(j\) 个物品分为 \(i\) 端的最小花费,则原式意为,枚举一个 \(k\) 个,将前 \(k\) 个分为 \(i-1\) 段,再加上后面这一段所需的花费。

那么此时,最 native 的算法是,三层循环枚举,时间复杂度就是 \(O(nm^2)\) 的。

决策单调性:设 \(k\)\(f(i,j)\) 的最优转移点,\(k'\)\(f(i, j')\) 的最优转移点,当 \(j<j'\) 时有 \(k\le k'\),则该 DP 具有决策单调性。

形象的:对于每一层(固定 \(i\) 不变),\(j\) 单增,其最优转移点(在 \(i-1\) 层上)单调不减。

因此,我们可以一层一层的 DP,对于第 \(i\) 层,我们先算 \(f(i, \mathrm{mid})\),其中 \(\mathrm{mid} = m/2\);同时求出 \(f(i, \mathrm{mid})\) 的最优转移点 \(f(i-1, \mathrm{opt})\)。那么 \([1,i-1]\) 的最优转移点只能在 \(f(i-1,1\dots \mathrm{opt})\) 中取,\([i+1,n]\) 的最优转移点只能在 \(f(i-1,\mathrm{opt}\dots n)\) 中取。

如图:动态规划——决策单调性优化DP 学习笔记

递归下去,即:

\(s(i,l,r,p,q)\) 表示算 \(f(i,l\dots r)\) 且最优转移点只可能在 \(f(i-1,p\dots q)\)中,先算 \(f(i,\mathrm{mid})\) 的值(即枚举 \(p\)\(q\)),求出最优转移点 \(\mathrm{opt}\)

然后递归求解:\(s(i,l,r,p,q)\rightarrow\left\{\begin{array}{c}s(i,l,\mathrm{mid}-1,p,\mathrm{opt})\\s(i,\mathrm{mid}+1,r,\mathrm{opt},q)\end{array}\right.\).

则时间复杂度为 \(O(nm \log m)\)

例题:CF321E Ciel and Gondolas.

点击查看代码

仅核心代码。

暴力:

inline int cost(const int x, const int y) {
    return (s[y][y] - s[y][x - 1] - s[x - 1][y] + s[x - 1][x - 1]) >> 1;
} signed main() {
    int n = ur, k = ur;
    for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) s[i][j] = ur + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    memset(f, 0x3f, sizeof f); for (int i = 0; i <= n; ++i) f[i][0] = 0;
    for (int i = 1; i <= k; ++i) for (int j = 0; j <= n; ++j) {
        for (int t = 0; t <= j; ++t) f[i][j] = min(f[i][j], f[i - 1][t] + cost(t + 1, j));
    } printf("%d\n", f[k][n]);
    return 0;
}

决策单调性优化:

inline int cost(const int x, const int y) {
    return (s[y][y] - s[y][x - 1] - s[x - 1][y] + s[x - 1][x - 1]) >> 1;
} void solve(int i, int l, int r, int p, int q) {
    if (l > r) return;
    int j = l + r >> 1, opt = 0;
    for (int t = p; t <= q && t <= j; ++t) {
        int e = f[i - 1][t] + cost(t + 1, j);
        if (f[i][j] > e) f[i][j] = e, opt = t;
    }
    solve(i, l, j - 1, p, opt);
    solve(i, j + 1, r, opt, q);
} signed main() {
    int n = rr, k = rr;
    for (int i = 1; i <= n; ++i) for (int j = 1 ; j <= n; ++j) s[i][j] = rr + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    memset(f, 0x3f, sizeof f); f[0][0] = 0;
    for (int i = 1; i <= k; ++i) solve(i, 0, n, 0, n);
    printf("%d\n", f[k][n]);
    return 0;
}

二、离线决策单调性

一维 DP,形如:\(f_r=\min\limits_{l=1}^{r-1}\{f_l+\text{cost}(l,r)\}\).

其决策单调性为 \(i\) 单增,其最优转移点 \(j\) 单调不见,比如:11122222244 这种。

动态规划——决策单调性优化DP 学习笔记

没听懂 zhq 老师讲的,等着看 wzm 的回放。。。

三、区间 DP 决策单调性

对于最优化的区间 DP,设 \(d_{i,j}\)\(f_{i,j}\) 的最优转移点,具有决策单调性的条件为 \(d_{l,r-1} \le d_{l,r} \le d_{l+1,r}\)

求解方法:按长度枚举区间;计算 \(f_{lr}\) 的时候,从 \(d_{l,r-1}\) 枚举到 \(d_{l+1,r}\)

时间复杂度:\(O(n^2)\),神奇的证明(\(\text{By zhq}\))如图:

动态规划——决策单调性优化DP 学习笔记

题单

见:https://www.luogu.com.cn/training/386809

Reference

[1] https://oi-wiki.org/dp/opt/quadrangle/
[2] https://www.cnblogs.com/lnzwz/p/12444390.html
[3] https://www.cnblogs.com/lhm-/p/12229791.html
[4] https://www.luogu.com.cn/blog/command-block/dp-di-jue-ce-dan-diao-xing-you-hua-zong-jie文章来源地址https://www.toymoban.com/news/detail-711388.html

到了这里,关于动态规划——决策单调性优化DP 学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划——区间DP 学习笔记

    不含四边形不等式优化。 线性动态规划的局限性在于,它只能顺推或倒退,而不能有子区间依赖的问题。 区间动态规划是线性动态规划的扩展,它将问题划分为若干个子区间,并通过定义状态和状态转移方程来求解每个子区间的最优解,最终得到整个区间的最优解。 区间动

    2024年02月08日
    浏览(33)
  • 动态规划——状压DP 学习笔记

    前置知识:位运算 动态规划的过程是随着阶段的增长,在每个状态维度上不断扩展的。 在任意时刻,已经求出最优解的状态与尚未求出最优解的状态在各维度上的分界点组成了 DP 扩展的“轮廓”。对于某些问题,我们需要在动态规划的“状态”中记录一个集合,保存这个“

    2024年02月08日
    浏览(45)
  • 动态规划——数位DP 学习笔记

    引入 数位 DP 往往都是这样的题型:给定一个区间 ([l, r]) ,求这个区间中满足某种条件的数的总数。 简单的暴力代码如下: 而当数据规模过大,暴力枚举就 (mathbb T) 飞了,因此引入数位 DP: 概念 数位(digit):对于十进制,即把一个数字按照个位、十位、百位等,一位

    2024年02月08日
    浏览(41)
  • AcWing算法学习笔记:动态规划(背包 + 线性dp + 区间dp + 计数dp + 状态压缩dp + 树形dp + 记忆化搜索)

    算法 复杂度 时间复杂度0(nm) 空间复杂度0(nv) 代码 算法 通过滚动数组对01背包朴素版进行空间上的优化 f[i] 与 f[i - 1]轮流交替 若体积从小到大进行遍历,当更新f[i, j]时,f[i - 1, j - vi] 已经在更新f[i, j - vi]时被更新了 因此体积需要从大到小进行遍历,当更新f[i, j]时,f[i - 1,

    2024年02月21日
    浏览(35)
  • 15.动态规划:数据结构优化DP

    数据结构优化DP有前缀和、滑动窗口、树状数组、线段树、单调栈、单调队列 中等 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, [3,6,2,7] 是数组 [0,3,1,6,2,2

    2024年02月03日
    浏览(40)
  • 从01背包开始动态规划:暴力解法 + dp + 滚动数组 + dp优化

        01背包问题是动态规划中最经典的问题之一,本篇将通过给出其四种解法,使读者更深刻理解动态规划。   有N件物品和一个容量是 V 的背包,每个物品有各自的体积和价值,且每个物品只能放一次(这也是01背包名字的由来),如何让背包里装入的物品具有最大的价值总

    2024年04月17日
    浏览(41)
  • 【优化数学模型】2. 动态规划DP方法的求解思路

    多阶段决策问题,就是要在允许的决策范围内,选择一个最优决策使整个系统在预定标准下达到最佳效果。 动态规划 (dynamic programming,DP) 是用来解决多阶段决策过程最优化的一种数量方法。其特点在于,它可以把一个n维决策问题变换为几个一维最优化问题,从而一个一个地去

    2024年02月21日
    浏览(33)
  • 动态规划(DP)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子

    2024年02月05日
    浏览(38)
  • 【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和

    动态规划 状态机dp 性能优化 给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。 由于答案可能会很大,将答案对 109 + 7 取余 后返回。 示

    2024年04月27日
    浏览(27)
  • 动态规划算法刷题笔记【状压dp】

    a1 == 1 判断是否为奇数,如果为1,则为奇数 因为奇数二进制末位一定是1,所以 与1 得到的结果是1 这里,114——2 14 ——第15位是1,可以表示14个1 i(1j)—— 从0开始是因为,原本第1位就是1。所以j=0时,对应的就是 i 的最低位 F l o y d Floyd Fl oy d 算法: n o w ∣ f l a g = = f l

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包