浅谈 LIS 问题的几种做法
LIS 问题也就是最长不下降子序列问题,是一个经典的问题。
做法一
我们发现可以动态规划,设
有转移方程:
可以用
做法二
有一个经典的
我们设
那么显然,这个
具体实现我就不给了,这个不是我们的重点。
做法三
我们都知道经典的
观察动态规划转移方程:
注意到这就是一个二维偏序问题,所以树状数组轻松解决,对于我这种数据结构爱好者简直是福音。
#include<bits/stdc++.h> #define LL long long using namespace std; const LL N=1e5+5; LL n,a[N],t[N],f[N],mx; LL lowbit(LL x) { return x&-x; } LL query(LL x) { LL ans=0; while(x) { ans=max(ans,t[x]); x-=lowbit(x); } return ans; } void update(LL x,LL y) { while(x<=n) { t[x]=max(t[x],y); x+=lowbit(x); } } int main() { scanf("%lld",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } for(int i=1;i<=n;i++) { f[i]=query(a[i])+1; update(a[i],f[i]); mx=max(f[i],mx); } printf("%lld",mx); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步