首页 > 其他分享 >WQS二分 学习笔记

WQS二分 学习笔记

时间:2024-06-04 16:57:35浏览次数:32  
标签:二分 WQS 段数 笔记 最小 斜率 cx 代价

问题引入

前置问题:把长度为 \(n\) 的正整数序列分为若干段,一段代价为这段和的平方加一个常数 \(c\),求最小代价。

设 \(f_i\) 表示考虑前 \(i\) 个数且最后一段结尾为 \(i\) 的代价,答案为 \(f_n\),\(f_i=\max_{j=0}^{i-1}\{f_j+(s_i-s_j)^2+c\}\),可以斜率优化,时间复杂度 \(O(n)\)。

把长度为 \(n\) 的正整数序列分为 \(k\) 段,一段的代价是这段和的平方,求最小代价。

设 \(f_{i,j}\) 表示前 \(i\) 个数分为 \(j\) 段,且最后一段结尾为 \(i\) 的代价,答案为 \(f_{n,k}\),同样可以斜率优化做到复杂度 \(O(nk)\),在 \(k\) 较小的时候已经可以通过了,但是 \(k\) 较大的时候,我们需要更优的算法。

算法思路

发现若不限制段数,这个问题的答案一定是把每个数都分为一段。我们可以通过修改分段的代价,给每一段加上一个额外的代价 \(c\)。

即 \(f'_{i,j}=\max_{k=0}^{i-1}{f'_{k,j-1}+(s_i-s_k)^2+c}\),也就是说 \(f'_{i,j}=f_{i,j}+jc\)。

直观感觉,\(c\) 越大,分出的段数就越少。我们可以试着通过二分这个 \(c\) 使得 \(f'_{n,x}\) 取得最小值时,\(x\) 恰好等于 \(k\)。这个时候问题等价于前置问题,算出 \(f'_{n}\) 就是 \(f'_{n,k}\),然后 \(f_{n,k}=f'_{n,k}-kc\)。

WQS 二分又叫 DP 凸优化,可以从几何的角度理解这个算法。

一种理解方式:考虑在平面上有 \(k\) 个点 \((i,f_{n,i})(1\leq i \leq k)\) ,同时相应的有 \((i,f'_{n,i}=f_{n,i}+ic)\) 这 \(k\) 个点,也就是说以 \(c\) 的斜率将原来的 \(k\) 个点拉伸得到一个新的图形。

根据题意观察可以发现一个事实:随着 \(c\) 的增大,这 \(k\) 个点中纵坐标最小的点的横坐标在不断减小,所以感性理解认为这 \(k\) 个点构成下凸壳。

所以我们二分 \(c\) ,直到拉伸得到的图形纵坐标最小的点横坐标为 \(k\) 即可。

如下图,从下向上第 \(2,3\) 个图形都是由原始的凸壳 \(1\) 以不同的 \(c\) 拉伸得到。红色的点横坐标为 \(k\),在第二个图形里面时为求得的 \(x\)。

pkJD9Nn.png

另一种理解方式:用斜率为 \(-c\) 的直线交 \((i,f_{n,i})\) 构成的凸壳,设此时的直线为 \(y=-cx+b\),交点为 \((x,f_{n,x})\),所以 \(f_{n,x}=-cx+b\),因此 \(b=f_{n,x}+cx=f'_{n,x}\)。由于满足 \(f'_{n,x}\) ,即 \(b\) 最小,其实就是要求 \(y=-cx+b\) 和凸壳相切。

发现斜率 \(-c\) 越小,切到的点横坐标越小,我们要二分调整切线的斜率 \(-c\) 使得切点横坐标为 \(k\),也就是 \(b=f'_{n,x}\) 最小时 \(x=k\)。

如图,点 \(C\) 为 \((k,f_{n,k})\),红色的直线即为所求。

实际上两种方式是差不多的,以 \(c\) 的斜率拉伸后得到的最小纵坐标的点,在拉伸前其实就是斜率 \(-c\) 的直线切凸包得到的切点。

算法流程

首先想办法证明答案关于段数是凸的:一般的方式为打表(考场上的最佳方式)或者结合实际意义。

二分 \(c\),然后 dp 计算不限段数,每增加一段额外代价为 \(c\) 的最小代价,dp 的同时计算选的段数 \(x\),直到。

实际实现的时候可能遇到 \((i,f_{n,i})\) 上三点共线,如果 \(k\) 在这条线中间的话,我们无论如何都无法找到一个 \(c\) 使求出的 \(x\) 恰好等于 \(k\)。此时根据我们的算法求得的 \(x\) 是代价最小基础上的最大还是最小段数,对于二分时左右端点的赋值需要分类讨论,注意细节,如果搞错了容易死循环。

在三点共线的情况下,斜率为 \(-c\) 时求出的 \(f'_{n}\) ,使 \(f'_{n}\) 取得最小值时的段数为 \(x\)。此时答案是 \(f'_n -ck\) 而不是 \(f'_n -cx\) ,原因结合 WQS 二分的意义。

应用

用于限制段数,且答案关于段数是凸的 DP 或者一些其他问题(比如最小度限制生成树),可以使用 WQS 二分去掉段数限制。

标签:二分,WQS,段数,笔记,最小,斜率,cx,代价
From: https://www.cnblogs.com/wonderfish/p/18231196

相关文章

  • 学习笔记482—手把手教你如何用mac访问win10共享文件
    这个方法巨简单,只需要两台电脑都用同一个网络,我的两台电脑都是连接wifi使用的,跟着图文一步步来操作哦操作步骤:......
  • 『大模型笔记』Transformer系列技术博文汇总!
    Transformer系列技术博文汇总!文章目录第1篇:矩阵乘法概念解释第2篇:使用缩放点积方法的自注意力第3篇:深入探讨多头注意力、自注意力和交叉注意力第4篇:Transformer架构第5篇:PostLN,PreLN和ResiDualTransformers第6篇:多头注意力的变种:多查询(MQA)和分组查询注意力(GQA)第7篇:Tr......
  • 读书笔记分享
    1.世界上的货币却不仅仅是变了几倍,而是变了100倍。看一下2010年支援欧元危机的金额吧。90兆日元!另外,2008年,美国政府的金融支援金也达到了70兆日元。比13年前多了2位数,是13年前的100倍!到底世界上有多少资金?中央银行印刷纸币能印到什么时候?极限点在哪里?2.虽然纸币是现在资......
  • 7 | 史上最全大数据笔记-Hive函数
    第八章Hive函数在Hive中,函数主要分两大类型,一种是内置函数,一种是用户自定义函数。8.1Hive内置函数8.1.1函数查看 showfunctions; descfunctionfunctionName;8.1.2日期函数1)当前系统时间函数:current_date()、current_timestamp()、unix_timestamp() --函......
  • 6.1-6.3学习笔记
     Linux学习Linux的所有文件均在根目录/下;在Linux中均使用反斜杠/;Linux系统中文件系统的层次结构:    /bin  存放系统的核心命令以及可执行的文件,如cp、cat命令等;    /boot 启动Linux系统所用的文件,如内核文件;    /dev  设备文件,用于访......
  • 【Python数据分析--Numpy库】Python数据分析Numpy库学习笔记,Python数据分析教程,Python
    一,Numpy教程给大家推荐一个很不错的笔记,个人长期学习过程中整理的Python超详细的学习笔记共21W字点我获取1-1安装1-1-1使用已有的发行版本对于许多用户,尤其是在Windows上,最简单的方法是下载以下的Python发行版,它们包含了所有的关键包(包括NumPy,SciPy,matplotlib,I......
  • 读书笔记
     1主要时间线《明朝那些事儿》叙述年限1344-1644年 明朝(1368年―1644年) 洪武元年(1368年)正月,即皇帝位于应天府,国号大明,年号洪武。明太祖朱元璋(1328年10月21日—1398年6月24日) 至正,元顺帝年号。至正元年1341年,朱元璋13岁。元朝(1271年-1368年)至正28年,1368年闰七月明军......
  • 云服务器安装-DDD-部署总结笔记
    DDD部署笔记链接:https://www.yuque.com/zhaozhaozhaozhao-khkij/vxgn28/qct4gxgunq3zhd7r?singleDoc#《2DDD开发运维》这里格式要好点。资料来源:Linux|小傅哥bugstack虫洞栈内容包括开发基础环境、脚手架(项目工程搭建)、发布部署环境等等。2.1基础环境+脚手架●......
  • 学习笔记14:模型保存
    转自:https://www.cnblogs.com/miraclepbc/p/14361926.html保存训练过程中使得测试集上准确率最高的参数importcopybest_model_wts=copy.deepcopy(model.state_dict())best_acc=0train_loss=[]train_acc=[]test_loss=[]test_acc=[]forepochinrange(extend......
  • 学习笔记15:第二种加载数据的方法
    转自:https://www.cnblogs.com/miraclepbc/p/14367560.html构建路径集和标签集取出所有路径importgloball_imgs_path=glob.glob(r"E:\datasets2\29-42\29-42\dataset2\dataset2\*.jpg")获得所有标签species=['cloudy','rain','shine',&......