首页 > 其他分享 >wqs 二分

wqs 二分

时间:2024-09-09 09:36:18浏览次数:8  
标签:二分 股票买卖 那么 wqs 我们 dp

wqs 二分可以优化一些 dp,最常见的是 ”选一些物品,次数有限制,使总价值最大“,有以下限制:

  • 定义 \(g(k)\) 为恰好用 \(k\) 此操作能获得的最大收益,那么 \(g(k)\) 要满足上凸。

  • 如果不考虑限制,可以比较快地求出答案。

前置

股票买卖Ⅰ

有 \(n\) 天,每天股票有一个价值 \(a_i\),但是每次手里只能有一支股票,每买卖一次需要花 \(c\) 的手续费,求最大价值。

首先有个很明显的 dp 做法,\(dp_{i,0/1}\) 代表第 \(i\) 天时手里 没有/有 股票的最大价值,答案就是 \(dp_{n,0}\)。

但是还有一个反悔贪心的做法,我们先让第一天强制买入,然后对于当前,假设股票价值为 \(q\) 考虑以下操作:

  1. 如果上次操作是 ”买入 \(p\) 价值的一个股票“:

如果 \(q < p\),那么买贵了,我们改成 ”买入 \(q\)“。

如果 \(q > p + c\),那么卖了可以赚钱,我们添加一个 ”卖出 \(q\)“。

  1. 如果上次操作是 ”卖出 \(p\)“:

如果 \(q > p\),那么卖便宜了,改成 ”卖出 \(q\)“。

如果 \(q < p - c\),那么我们添加一个 ”买入 \(q\)“。因为如果 \(q \ge p - c\),那么后面卖出一个 \(r\) 的时候,不如把 ”卖出 \(p\)“ 改成 ”卖出 \(r\)“,这样更优。

正题

股票买卖Ⅱ

有 \(n\) 天,每天股票有一个价值 \(a_i\),但是每次手里只能有一支股票,只能进行 \(k\) 次交易,求最大价值。

首先很显然可以 dp 求解,复杂度 \(O(nk)\)。而使用 wqs 可以得到一个 log 的算法。

思考费用流,发现这个东西根据 SSP 的费用流增广办法,增广路价值肯定是单减的。

所以我们把 $g(k) = $ 恰好 \(k\) 次操作能得到的最大值 这个东西的图像画出来,大概是这样的:

那么我们现在考虑随机选择一个价值 \(c\),每次交易需要 \(c\) 的手续费。

那么假设我们有手续费时最优解为 \(ans\),那么会有 \(ans + p\times c = g(p)\),注意到这个函数是一个凸包,所以你可以认为有一个斜率为 \(c\) 的直线去切这个凸包,切出来的就是最大值,我们这个时候就可以无视交易次数的限制,就转化为 股票买卖Ⅰ。

然后我们可以二分斜率 \(c\),就可以求出在 \(k\) 点切时最优的 \(ans\),就可以反求 \(g(k)\) 了。

但是问题在于,我们现在可能有多点共线,那么我们就想要最小操作次数的那个位置,在解决 股票买卖Ⅰ 的时候,我们就要避免收入为 0 的买卖,这样就是最小的。

然后对于这个题,我们如果想要操作次数小于等于 \(k\) 的,那么我们可以把二分斜率的下界改成 \(0\),这样就一定是最大的了。

标签:二分,股票买卖,那么,wqs,我们,dp
From: https://www.cnblogs.com/LUlululu1616/p/18403945

相关文章

  • 4.二分查找
    classSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length-1;returnres(nums,target,left,right);}intres(int[]nums,inttarget,intleft,intright){intmid=(left+right)/2;if(mi......
  • 第二周9.7周六学习总结——二分
    while(l<r){intmid=l+r>>1; //(l+r)/2if(check(mid))r=mid;//check()判断mid是否满足性质elsel=mid+1;} while(l<r){intmid=l+r+1>>1; //(l+r+1)/2,往右找答案要加1......
  • 信息学奥赛初赛天天练-85-NOIP2014普及组-基础题4-链表、随机存取、顺序存取、二分查
    信息学奥赛初赛天天练-85-NOIP2014普及组-基础题4-链表、随机存取、顺序存取、二分查找、二分比较、循环结构、图领奖PDF文档公众号回复关键字:202409071NOIP2014普及组基础题49下列选项中不属于图像格式的是()AJPEG格式BTXT格式CGIF格式DPNG格式1......
  • 算法-二分查找
    二分查找是在一个有序的数组中查找目标值target,需要将target和数组中间元素做比较:1)如果target=mid,查找成功,返回mid的下标。2)如果target>mid,目标在数组右半部分,low=mid+13)target<mid,目标在数组左半部分,high=mid-1如下数组:1、首先,指定数组的左指针和右指针,根据公式mid......
  • 搜索算法之二分搜索详细解读(附带Java代码解读)
    1.基本概念二分搜索(BinarySearch)是一种高效的查找算法,用于在一个已排序的数组中查找特定元素。它通过逐步将搜索范围减少一半来实现搜索,从而比线性搜索更快。由于它利用了数组的有序性,能够在对数时间内完成搜索操作。2.工作原理二分搜索的基本思想是:初始化:设置两个指针......
  • 1.3二分算法
    算法理解二分用于解决答案具有单调性问题(经典最大值最小问题),是一个好的入手点,用一个log的复杂度,将求解答案转化成了判断答案是否合法实数域上的二分两种方法:确定精度eps,固定枚举次数,一般后者精度大于前者T1:二分最大值,注:如果有一个数本身就大于二分答案,则答案肯定错误,证明:考虑......
  • DP优化——wqs二分
    在看wqs二分前建议先去看另一篇博客——斜率优化,对凸包等知识点有所了解。介绍wqs二分最初由王钦石在他的2012年国家集训队论文中提出,也叫"带权二分",或者"dp凸优化",而从IOI2016的Aliens题目开始,这种方法开始逐步在竞赛圈中有了一定的地位。在国内我们一般称为「wqs二......
  • 二分查找:手拿把掐!------Java代码实现
    “没有天赋,那就不断重复.”文章目录前言文章有误敬请斧正不胜感恩!模板一:(最基本的)**左闭右闭:**[left,right]模板二:**左闭右开区间模板:**区间:左闭右开[left,right):模板三:开区间模板:(left,right)循环不变量:二分查找易错点:做题经验:疑问及解答:我自己的......
  • [OI] 整体二分
    整体二分可以理解成普通二分改版,其实并没有改多少,并且一般对check()函数的复杂度要求更宽松先来看一道经典题目:求区间排名给一个数列,若干组询问\((l,r,k)\),求\([l,r]\)内第\(k\)大,询问次数较大注意到询问次数较大,因此需要整体二分来解决首先考虑普通二分,很容易想到一......
  • 二分查找精炼回顾-kevin
    二分搜索回顾,由于习惯问题,二分搜索问题都采用闭区间来思考二分搜索总共就三类问题,统一规范如下,由于都统一采用闭区间来思考,所以while的判定条件都是**left<=right**mid在都是在while循环之后再更新left=0,right=len(nums)-1#所以二分搜索区间是[left,rig......