子序列

某个序列的子序列是从最初序列通过去除某些元素(可以不去除,也可以全部去除)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。设原序列为\(\{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
posted on 2016-11-17 12:49  yanhh  阅读(189)  评论(0编辑  收藏  举报