最长上升子序列(LIS)
问题模型:
给定一个长度为\(N\)的序列,试求它单调递增的子序列的长度最大是多少?例如:原序列A{4, 8, 9, 5, 6, 7},最长子序列{4,5,6,7}长度为 4
方法一:排序 + LCS
把原序列A排序并去重后得到单调递增序列B,然后求解它们的 最长公共子序列(LCS)
\[dp[i][j] =
\begin{cases}
dp[i-1][j-1] + 1,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, A[i]= B[j] \\
max\{dp[i-1][j], dp[i][j-1]\},\,\, A[i]\neq B[j] \\
\end{cases}
\]
方法二:动态规划
定义状态\(dp[i]\),表示以第\(i\)个数为结尾的最长递增子序列的长度,那么:
\[dp[i] = 1,\\
dp[i] = max\{dp[i],\,\, dp[j]+1\},\,\,\,\, j < i,\,A_{j}<A_{i}\\
ans = max\{dp[i]\}
\]
方法三:贪心 + 二分
维护一个上升数组\(d[]\),按顺序以原序列A中元素代替\(d[]\)中第一个不小于它的元素(未找到就加到d[]末尾)
\[id = lower\_bound(d+1, d+tot+1, a[i]) - d;\\
\begin{cases}
d[++tot] = a[i], \,\, id = tot + 1\\
d[id] = a[i], \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, id \neq tot + 1\\
\end{cases}
\]