子序列
某个序列的子序列是从最初序列通过去除某些元素(可以不去除,也可以全部去除)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。设原序列为\(\{a_1,a_2,a_3\dots a_n\}\)则\(\{a_i, a_j, a_k, \dots | 1 \le i<j<k< \dots \le n\}\)是它的一个子序列。如对于\(\{1,2,3,4,5,6,7\}\)这个序列,\(\emptyset,\{1,3,5,7\},\{2,4,6\},\{1,3,5,6,7\},\{1,2,3,4,5,6,7\}\)都是它的子序列(不是全部)。
动态规划 最长xxx子序列的长度
求最长下降子序列、最长上升子序列、最长不下降子序列……的长度都可以归为这一类问题。
定义:设\(P(a,b)\)是某一性质,如求最长下降子序列时性质为下降:\(P(a,b) \iff a>b\),求最长上升子序列时性质为上升:\(P(a,b) \iff a<b\)。给定序列\(S = \{a_1,a_1,a_2,a_3\dots a_n\}\),求它的最长的子序列\(\{b_1,b_1,b_2\dots b_m | \forall i<j, P(b_i,b_j) \}\)的长度。
如\(\{11,7,6,5,9,8,7,10,9,8,7\}\)的最长下降子序列是\(\{11,10,9,8,7\}\),\(\{1,2,3,1\}\)的最长上升子序列是\(\{1,2,3\}\)
\(O(n^2)\)的动态规划方法:记\(l_i\)为以第i个数结尾的子序列的最长长度,则\(l_1 = 1\),当\(i>1\)时\(l_i = 1+\max_{k \in [1,i)} \{l_k | P(a_k,a_i) \}\)。然后答案就是\(\max_{i=1}^{n}{l_i}\)。
Markdown
表格:
T1 | T2 |
---|---|
1 | 2 |
3 | 4 |