最长不下降子序列nlogn做法及其拓展
最长不下降子序列nlogn做法及其扩展
前言&nlogn做法
LIS表示最长不下降子序列
考虑设表示LIS长度为i的最小值(具有单调性),对于每个新的x,二分出最大的满足小于等于x的位置w,更新w+1
还有一种单调栈理解法,假若已经维护了一个LIS在单调栈里,对于一个新的x,二分出最大的满足值小于等于x的位置w,更新w+1,可以证明不会影响答案(其实代码来说是一样的)
[P7931 [COCI2021-2022#1] Volontiranje
给定一个 的排列 ,请从这里面取出尽可能多的不交的上升子序列,且他们的长度为原排列的 LIS 的长度,并构造一组方案。
考虑用二分找到LIS长度len,然后把把出现在中的数字都压进一个栈里(先出现的在栈顶)
于是我们得到len个栈:
其中每个栈中的元素单调递减,且总数为n
然后考虑构造一个LIS就只能从每个栈中各选一个,可以想到先取栈顶,若合法就取下一个栈,否则就pop,直到全部的栈为空
可以发现一定能取出最多的LIS
石中剑的考验
给出1 ∼ n的一个排列的一个最长上升子序列(长度为k,),求原排列可能的种类数。
其中原排列合法的充要条件是:
给出的子序列是原排列的子序列;
原排列的最长上升子序列长度为k。
发现n比较小,考虑状压,根据我们nlogn的单调栈思想,设,s是三进制,0/1/2表示未选/选了不在栈中/选了在栈中
然后n转移,跑不满
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端