动态规划基础
参考资料
最长上升子序列
最长上升子序列(Longest Increasing Subsequence,LIS)指找到给定序列的一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能大。
朴素 DP 设 为以 结尾的 LIS 长度,由所有满足 的 转移,复杂度 。用一个单调数组配合二分(维护各长度 LIS 的最小结尾),或用树状数组维护前缀最大值,都能优化到 。
- 动态规划
- 二分查找
- 树状数组
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(a[j]<a[i])f[i]=max(f[i],f[j]+1);
}
ans=max(ans,f[i]);
}
for(int i=1;i<=n;i++)
{
int k=lower_bound(b+1,b+n+1,a[i])-b;
b[k]=a[i];
ans=max(ans,k);
}
for(int i=1;i<=n;i++)
{
int k=query(a[i]-1)+1;
update(a[i],k);
ans=max(ans,k);
}