首页 > 其他分享 >K-单调

K-单调

时间:2024-08-19 13:49:05浏览次数:8  
标签:text cost 计算 上升 单调 左偏

设\(f[i][j]\)表示前\(i\)个数被恰好分为\(j\)个单调区间的最小花费,有\(f[i][j]=\overset{i-1}{\underset{p=1}{\min}}(f[p][j-1]+\text{cost}[p+1][i])\),其中\(\text{cost}[i][j]\)表示区间\([i,j]\)分成一个单调序列的最小花费。于是问题转化成了求\(\text{cost}\);而由题意不难知道这就是上面一道题目(只不过我们还需要求单调下降的情况,这里有个trick,直接将原数列所有数取相反数再求单调上升即可,从答案集合的角度可以知道是正确的)

然而,我们不能在外界循环\(i,j\),然后通过\(O((j-i+1)\log (j-i+1))\)的复杂度去算\(\text{cost}[i][j]\),这样会超时的。我们只能想办法利用之前已经计算过的信息。假设当前计算的是单调上升。我们外层枚举\(i\),然后跑一次左偏树合并,当内层跑到\(j\)的时候,假设我们已经计算好了\(\text{cost}[i][i]\)到\(\text{cost}[i][j-1]\),那么对于\(\text{cost}[i][j]\)来说,我们只用记录最后一段区间的贡献(这个需要记录左偏树的所有节点的权值和),再利用之前已经算好了的\(\text{cost}\)即可(子问题具有最优性)

需要注意的是,\(\text{cost}\)应该开三维,最后一维用来记录是单调上升还是单调下降,因为两者计算的时候不应该互相干扰,如果不再开一维的话,可以计算单调上升的时候会用到单调下降的\(\text{cost}\),这样肯定就错了

具体见打卡代码

标签:text,cost,计算,上升,单调,左偏
From: https://www.cnblogs.com/dingxingdi/p/18367157

相关文章

  • 单调栈
    单调证需要一直保证栈中元素是按序排列的。插入元素时首先检查,循环检查栈顶元素是否符合条件,不符合则弹出。不需要再将弹出元素插入回去。如果插入回去的话,其实整套程序逻辑实现就会多此一举,不如直接插入之后sort()即可。classMyMonoStack{public://constructorMyMo......
  • 代码随想录 day31|| 56 合并区间,738 单调递增数字,968 监控二叉树
    56合并区间funcmerge(intervals[][]int)[][]int{ //思路先排序,然后按照后一个左区间和前一个右区间进行对比判断是否重叠,重叠扩充右区间 sort.Slice(intervals,func(i,jint)bool{ ifintervals[i][0]==intervals[j][0]{ returnintervals[i][1]<intervals[......
  • 【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain
    【单调栈+倍增】[P7167[eJOI2020Day1]Fountain思路用单调栈处理每个圆盘溢出后流到的第一个位置,然后倍增优化。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • 决策单调性优化
    决策单调性优化对于形如\[f_i=\min_{j=0}^{i-1}\{f_j+w(j,i)\}\]的转移方程,记\(p_i\)为令\(f_i\)取得最小值的\(j\)的值(最优决策点)。若\(p\)单调不降,则称\(f\)具有决策单调性。四边形不等式以上述转移方程为例,四边形不等式的一个形式为:若对于任意\(......
  • 代码随想录算法训练营第二十七天| 56. 合并区间、738.单调递增的数字
    写代码的第二十七天最后一天贪心!!!加油呀!!!56.合并区间思路这道题本质上和昨天的两道题是几乎完全一致的,都是判断重叠区间,只不过昨天的射箭那道题是统计有多少重叠区间,无重叠区间那道题是找到重叠区间然后删除,这道题是找到重叠区间然后合并。解决问题1:如何对重叠区间进行......
  • 「单调优化 dp」做题记录
    「单调优化dp」做题记录P1941[NOIP2014提高组]飞扬的小鸟设\(f(i,j)\)表示使小鸟到达\((i,j)\)所需的最少点击数。不难写出转移方程:\[f(i,j)=\min\begin{cases}f(i-1,j+y_{i-1}),\text{if}j+y_{i-1}\lem\\f(i-1,x-kx_{i-1}),k\in\mathbb{N}......
  • 代码随想录算法训练营第50天 | 单调栈01
    代码随想录算法训练营第天|739.每日温度https://leetcode.cn/problems/daily-temperatures/description/代码随想录https://programmercarl.com/0739.每日温度.html#其他语言版本496.下一个更大元素Ihttps://leetcode.cn/problems/next-greater-element-i/description/......
  • 算法板子:滑动窗口——应用单调队列,找到窗口中的最小值与最大值
    #include<iostream>usingnamespacestd;constintN=1e6+10;inta[N];//q数组模拟单调队列;q数组存储原数组元素的下标;//递增单调队列的队头始终维护窗口中的最小值;队头存的是窗口中最小值的下标//递减单调队列的队头始终维护窗口中的最大值;队头存的......
  • 单调栈和单调队列
    单调栈和单调队列P5788#include<bits/stdc++.h>usingnamespacestd;constintN=3e6+5;intn,a[N],ans[N],top,stk[N];intmain(){ scanf("%d",&n); for(inti=1;i<=n;++i){ scanf("%d",&a[i]); while(top>0&&a[stk[......
  • 单调队列-滑动窗口最大值
    题目:给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。思路:通过双端队列,因为只看得到k个数字,所以先在队列放入k个数字,并且每次放入时都要将他与......