最长上升子序列(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} \]

方法四:树状数组

以元素从小到大的顺序更新\(dp[i]\),每次更新用树状数组进行优化。(元素相等时序号大的优先)

posted @ 2020-11-20 13:52  Daowuu  阅读(62)  评论(0编辑  收藏  举报