Longest Monotone Subsequence
严格单调递增子序列
求a[n]的最长严格单调递增子序列长度,简称LMS
思路1:动态规划
考虑dp[i]=以a[i]结尾的最长LMS
- 首先,对于
a[1],最长严单增子序显然是它本身,也就是长度为dp[1]=1 - 对于i>1,考虑
a[i]与a[j], 1 <= j < i- 如果
a[j] < a[i],那么显然a[j]结尾的最长严单增子序,尾部再加上一个a[i],仍然严单增 - 如果
a[j] >= a[i],那么反之,a[i]不能与a[j]结尾的子序列构成最长严单增子序
- 如果
- 则有dp方程:
dp[i] = Max{dp[i], dp[j] + 1 if a[j] < a[i] else 1}
时间复杂度:O(n^2)
空间复杂度:O(n)
模板
1 | // cmp: < 时为最长严单增子序列; <= 时为最长单增子序列; 反之为相应的递减 |
思路2:贪心+二分查找
- 考虑计算
dp[i]时: - 有
x, y < i,且a[x] < a[y] < a[i],且dp[x] = dp[y],那么选择x显然比选择y更好 - 所以可以使用贪心:维护一个数组
b[],使得b[j], 1<=j<=t为a[i], 1<=i<=n中长度为j的最长单调子序列中尾元素的最小值 - 那么,当
a[i] > b[t]时,显然dp[i] = b[t]+1,同时要令b[++t] = a[i] - 反之,从
b[j], 1<=j<=t中找出第一个满足b[j]>=a[i]的,令b[j] = a[i] - 可以发现最终
dp[n] = t,故可省去dp[i] - 可以发现
b[]是满足严单增的,故a[i] <= b[t]时可用二分法查找
时间复杂度:O(nlogn)
空间复杂度:O(n)
模板
1 | // cmp: < 时为第一个大于key的; <= 时为最后一个等于或第一个大于; 反之为相应的 |