ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

WQS二分学习笔记

2020-11-10 18:31:41  阅读:323  来源: 互联网

标签:二分 切线 WQS 笔记 权值 物品 负权


WQS二分学习笔记

完全没看懂……

事情的起因,是一道叫做林克卡特树的题。

题目大意:从一棵树中选出 \(k+1\) 条非相邻链,要求链的权值和尽量大。有负权边。

首先能想到一个简单的DP,\(f[i][j][0/1/2]\):以\(i\)为根的子树中,选了\(j\)条链,0:\(i\)没选 1:\(i\)在链的端点上

2:\(i\)在一条链中间

时间复杂度\(O(nk^2)\),可以摸到45分的好成绩。

优化

很明显我们还需要进一步优化。

对\(k\)打表后我们发现,\(k\)递增的情况下\(f[1][k]\)是一个上凸函数(图像类似于二次函数图像)。

简略证明:由于图中存在负权边,所以选边时肯定优先不选这些负权边。但随k的增大负权边会被删完,此时只能开始不选正权边,于是出现了答案先上升后下降的趋势

所以,我们可以使用一种叫WQS二分的方法进行优化。

WQS二分

wqs二分一般用于一种特殊的背包问题:有\(n\)个带权物品,选用物品时有一定限制,需要取\(m\)个物品,要求取出的权值和尽量大。且若设取出权值和为\(f(m)\),\(f(m)\)必须为关于\(m\)的上凸函数。

假设\(f(m)\)图像如下

我们先画出一条这个函数的切线

设这条切线的解析式为\(f(x)=k\times x+b\)。则切线在纵坐标轴上的截距可以用\(b=f(x)-k\times x\)表示。同时,有一个显而易见的结论:平移这条切线,保证与函数相交的情况下这条直线的纵截距不会超过切线的截距。

所以,只要我们能找到\(b_{max}\),就能求出当前斜率下的\(f(x)_{max}\),进而求出当前切点的\(x\)值。

我们再观察\(b\)的表达式。观察到\(f(x)\)的含义是取\(x\)个带权值的物品时最大权值和。所以,我们想到把所有物品的权值都\(-k\),就能完美地用一个新函数\(f'(x)\)来表示出\(b\)。

为了验证当前斜率是否是答案,我们可以用\(f'(x)\)进行不限物品数量的动态规划,同时记录下\(f(x)\)的最佳转移点。取出最佳转移点的物品使用量,再与要求的量\(m\)进行比较。如何调整斜率根据题目而定。若最佳转移点有多个,我们可以选择取靠后的哪个。

于是,我们成功把林克卡特树优化到了\(nlog(k)\)。

参考:!(https://www.cnblogs.com/dummyummy/p/10574081.html)(https://www.cnblogs.com/dummyummy/p/10574081.html)

标签:二分,切线,WQS,笔记,权值,物品,负权
来源: https://www.cnblogs.com/cooper233/p/13955290.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有