子序列
某个序列的子序列是从最初序列通过去除某些元素(可以不去除,也可以全部去除)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。设原序列为({a_1,a_2,a_3dots 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_3dots a_n}),求它的最长的子序列({b_1,b_1,b_2dots 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 |