动态规划——带权二分优化DP 学习笔记

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

动态规划——带权二分优化DP 学习笔记

引入

带权二分其实并不一定用于优化 DP,也可能用于优化贪心等最优化的算法。

带权二分也叫 WQS 二分,最初由王钦石在他的 2012 年国家集训队论文中提出。

定义

使用情况

  • 要解决一个最优化问题(求最大 / 最小值)
  • 有一个限制,一般是某个参数要求一定恰好为 \(k\)

而带权二分就可以很好的解决[恰好 \(k\)]的限制;以选物品取最大收益为例:

  • \(f(k)\) 为恰好选 \(k\) 个时的最大收益,将所有的 \((k, f(k))\) 画出来,图像必须组成一个凸包。
  • 因此就可以打表看,是否组成了一个凸包,如果是,则可以考虑带权二分优化。

使用方法

例:求 \(f(k)\) 的值,我们不会求 \(f(k)\) 或者其复杂度不可接受,但是我们可以求出所有 \(1\sim n\) 中的最优解 \(f(t)\) 及对应的 \(t\),因此我们就可以通过一些处理,将 \(f(k)\) 变为最小值,即将全局最优解变为 \(k\)

什么方法?我们设一个额外的 \(w\),每次选一次物品以后就将结果加上 \(w\),也就是,我们设一个新的转移方程 \(g_k=f_k+kw\)

注意:严谨的,是『选一次』,不是『选一个』。因为有的题目选一次对应一段区间,即多个物品。

可以预见到的,原函数(左)会变为(右):

动态规划——带权二分优化DP 学习笔记

要注意的是,\(w\) 也可能为负;因此总会有一个 \(w\) 使得全局最优解为 \(g(k)\),如下:

  • 可以想见,如果 \(w\) 继续增大,那么最小值点 \(x_0\) 会继续变小;
  • 如果 \(w\) 减小以至于变成负数,那么最小值点 \(x_0\) 会不断变大;

那么总会有一个 \(w\),使得最小值在 \(k\) 处取到,那不就可以二分了嘛。

我们二分一个值 \(w\)(边界可以设置地大一些,当然也可能得根据题目的数据范围调一调),现在问题转化为,求 \(g(x)\) 的最小值点 \(x_0\)

此时,不管用 DP 还是贪心啥的方法,求出 \(g(x)\) 的最小值 \(g(x_0)\),顺便求出此时的最小值点 \(x_0\)

  • \(x_0<k\),那就让 \(w\) 变小点;
  • \(x_0>k\),那就让 \(w\) 变大点。

最终,我们就能让 \(x_0=k\),也就是当全局最优解取到 \(g(k)\) 的时候,我们是不是就成功的求出了原问题 \(f(k) = g(k) - kw\) 呢?

警惕

既然是二分,就一定要仔细考虑 \(l,r,mid\) 的取值以及更新边界的条件,总之,注意代码细节!

应用

例题讲解

题目:P2619 Tree I

  • 画出函数来:

动态规划——带权二分优化DP 学习笔记

  • 凸函数好吧,所以给白边加一个 \(w\) 的额外权:
int l = -110, r = 110;
while (l <= r) {
    int mid = l + r >> 1; Kruskal(mid);
    if (now0 >= k) {
        ans = ansg - k * mid;
        r = mid + 1;
    } else r = mid - 1;
}
  • 此题完结。

题单

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

Reference

[1] https://www.mina.moe/archives/6349
[2] https://www.cnblogs.com/Dfkuaid-210/p/wqs_bisect.html
[3] https://blog.csdn.net/Emm_Titan/article/details/124035796
[4] https://blog.csdn.net/weixin_45429627/article/details/109270538
[5] https://blog.csdn.net/Huah_2018/article/details/113796445文章来源地址https://www.toymoban.com/news/detail-711667.html

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

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

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

相关文章

  • 动态规划——树形DP 学习笔记

    前置知识:树基础。 树形 DP,即在树上进行的 DP,最常见的状态表示为 (f_{u,cdots}) ,表示以 (u) 为根的子树的某个东东。 本文将讲解一些经典题目(树的子树个数、树的最大独立集、树的最小点覆盖、树的最小支配集、树的直径、树的重心、树的中心),以及一些常见形

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

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

    2024年02月08日
    浏览(43)
  • 动态规划——区间DP 学习笔记

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

    2024年02月08日
    浏览(37)
  • 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日
    浏览(39)
  • 15.动态规划:数据结构优化DP

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

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

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

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

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

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

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

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

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

    2024年04月27日
    浏览(30)
  • 动态规划算法刷题笔记【状压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日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包