首页 > 其他分享 >分治优化

分治优化

时间:2023-01-15 10:24:29浏览次数:41  
标签:背包 frac 复杂度 分治 geqslant 优化 dp

概述

  • 分治优化常常在 DP 的转移有某种单向单调性时使用,通过类似整体二分的结构,确保每个决策点只在一条链上出现,从而加速转移。一般这种分治优化也有对应的二分栈形式,区别仅在于逆推和顺推。此部分在四边形不等式优化一节。

  • 分治优化本身还是一种非常有趣的 DP 实现方式。这一部分...我还不是非常了解,也是本节的重点。

CF1442D Sum

  • 题意略。下面的复杂度分析里,因为 \(n,K\) 同阶,用 \(n\) 代替 \(K\)。

  • 发现这个就是把我们广义多重背包的物品反了过来,更短的转移反而“性价比”更高。考虑利用四边形不等式。

  • 那么起式子,\(dp_{i,j}=\max_{k\leqslant j}(dp_{i-1,k}+v_{i,j-k})\)。这里不写那种四边形形式了,容易看出,交叉小于包含。

  • 当然 dp 的转移来源还是要推一下,盲猜有 \(k_{j-1}\geqslant k_j\),理由是取 \(l<l'\leqslant r<r'\),假设有 \(k_r=l,k_{r'}=l'\),推一下试试:

    • \(dp_{i-1,l}+v_{r-l}+dp_{i-1,l'}+v_{r'-l'}\geqslant dp_{i-1,l}+v_{r'-l}+dp_{i-1,l'}+v_{r-l'}\)。

    • 左右消一下,得到 \(v_{r-l}+v_{r'-l'}\geqslant v_{r'-l}+v_{r-l'}\),显然和交叉小于包含矛盾了。

  • 那完事了,\(O(n^2\log)\)?等等,我怎么觉得这个结论很反直觉?

  • 令 \(j-1=0\),则 \(k_{j-1}=0\),从而...从而......\(k=0\)。显然不可能啊摔!

  • 好吧,我们再仔细看看式子:上面的推导只能说明 \(dp_{i-1,l}+v_{r-l}+dp_{i-1,l'}+v_{r'-l'}\leqslant dp_{i-1,l}+v_{r'-l}+dp_{i-1,l'}+v_{r-l'}\),然而这一式子不能推出 \(k_{j-1}\geqslant k_j\),其只是 \(k_{j-1}\geqslant k_j\) 的必要条件。

  • ...好吧。我们回到一开始的性价比,有一个直觉是这样的:只会有一组不选完,毕竟越选越划算,如果靠后的没选完的那一组更划算,则应该都选那组,否则都选这组。

  • 形式化地说,设有两组物品 \(A,B\) 都没选完,不妨认为分别选了 \(k_A,k_B\) 个,则:

    • 若 \(A_{k_A+1}\geqslant B_{k_B}\):放弃取 \(B\),尽量取 \(A\),显然不更劣。

    • 若 \(A_{k_A+1}<B_{k_B}\):这代表着 \(A_{k_A}<B_{k_B}\),于是放弃取 \(A\),尽量取 \(B\),显然更优。

  • OK!那么这样一来,除了我们钦定的那一组之外,都变成 \(01\) 背包了,要么不选要么选完。然而...暴力枚举哪一组不选完?组内的 dp 容易预处理,毕竟就是前缀和;然而即使我处理好前后缀 dp,这一部分的复杂度是 \(O(n^2)\),把三个背包暴力合到一起...虽然合两个其实就够了(第二次不用合,因为只关心 \(dp_K\)),但 \(O(n^2)\) 做 \(n\) 遍,还是暴力复杂度啊。

  • 解法 1:分块。

    • 分 \(B\) 个块,暴力枚举不选完的在哪个块里,合并前后缀 DP 或直接暴力 DP 一遍,反正都是 \(O(n^2)\)。

    • 在块内暴力枚举哪个没选完,将其他的物品暴力转到刚才的背包里,\(O(\frac{n}{B}(\frac{n}{B}n))\)。

    • 暴力枚举没选完的选了几个,计算对应情况下选 \(K\) 个的最大总价值,\(O(n)\)。

    • 故总复杂度为 \(O(B(n^2+\frac{n}{B}(\frac{n^2}{B}+n)))=O(Bn^2+\frac{n^3}{B})=O(n^2(B+\frac{n}{B}))\),取 \(B=\sqrt{n}\),复杂度为 \(O(n^2\sqrt{n})\)。

    • 够过了,虽然纸面 \(5\times 10^8\),但背包常数小。

  • 解法 2:分治。

    • 考虑用二分树。怎么到处都是二分树!也许该叫分治树?

    • 令初始区间为 \([1,n]\),先考虑 \(key\leqslant mid\) 的情况,\(key\) 为不选完的一组,此时将 \([mid+1,r]\) 的物品转进背包得到左子区间的背包,回溯时再考虑 \(key>mid\),将 \([l,mid]\) 转进背包。

    • 即我们维护的背包其实是“除了当前区间外的全局背包”。可以看出,同时只需要维护一条链上的 \(\log\) 个背包(转移完毕的就好),每一层都将所有物品转移一次,空间回收的复杂度因为分治树只有 \(O(n)\) 个点所以是 \(O(n^2)\),故总复杂度 \(O(n^2\log)\)。

    • 妙哉!

标签:背包,frac,复杂度,分治,geqslant,优化,dp
From: https://www.cnblogs.com/weixin2024/p/17053137.html

相关文章

  • 树分治
    概述树分治通过树的唯一连通性质,递归地求解树上路径(主要是路径长度)相关的问题。树分治主要包括点分治和边分治,但到目前为止我都不知道边分治有什么用。点分治......
  • 常数优化
    数据类型显而易见地,越小的型的运算越快。大体来讲longlong的常数比int大一倍,但__int128的比longlong大一倍不止(因为没有128位机,故__int128的实现是“......
  • mysql索引优化-01
    1.1索引是什么?  mysql官方对于索引的定义:可以帮助mysql高效的获取数据的数据结构。  mysql在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据......
  • mysql like性能优化
    网上很多优化like的方法,无非下面几种,抄来抄去的。我用213万条数据,每条数据50个字段左右(用的真实的生产环境的mysql数据库,和真实的生产环境的数据),做了性能测试;时间记录的次数......
  • 线段树优化建图学习笔记
    使用场景:单点向区间,区间向单点或区间向区间建边。实现原理:用线段树的一个节点管辖一段图上区间的顶点。实现步骤:将原图中的顶点拆点(理论上,实际代码中不需要),出点和入点......
  • 【Redis实战专题】「性能监控系列」全方位探索Redis的性能监控以及优化指南
    Redis基本简介Redis是一个开源(BSD许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复......
  • 如何通过物联网网关感知工业设备故障,优化设备维护体验?
    传统的工业生产中,设备维护一直存在效率低下的问题。传感的设备管理模式无法实时感知设备运行状态,往往在设备故障停机之后才联系工程师进行维护,严重影响生产效益和订单交付;对......
  • 【Elastic Search】优化检索
    查询(query)与过滤(filter)的区别 如下为检索优化方案(部分内容有重复)https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.ht......
  • jQuery事件(事件委托/优化添加删除表格记录/事件委托delegate中的this对应关系)
    视频为什么要用事件委托:新增的dom元素没有对应点击事件。子元素的事件交给父元素来代为处理。父元素要知道是哪个子元素发生的。<!DOCTYPEHTML><html><head><meta......
  • tomcat调优 tomcat配置优化
    1.修改内存/jvm配置调整前JAVA_OPTS="-Xms1024m-Xmx4096m-Xss1024K-XX:PermSize=512m-XX:MaxPermSize=2048m"调整后JAVA_OPTS="-Xms2048m-Xmx2048m-Xss1024K-XX:Perm......