注1
:这里的LCS问题是字符串a和字符串b元素相同,只是排列不同。
注2
:下面提到的 f ( x ) f(x) f(x)等价于序列按关键字排序,只不过换一种角度
LCS
:LCS(Longest Common Subsequence,最长公共子序列)是指给定两个序列 S1 和 S2,找出它们最长的公共子序列的长度。
问题分解
如果 S1[i] 等于 S2[j],则 dp[i][j] = dp[i-1][j-1] + 1,表示当前元素属于公共子序列,长度加一。
如果 S1[i] 不等于 S2[j],则 dp[i][j] = max(dp[i-1][j], dp[i][j-1]),表示当前元素不属于公共子序列,取左方或上方的最大值
LIS
:LIS(Longest Increasing Subsequence,最长递增子序列)是指在给定序列中找到一个最长的递增子序列,其中递增子序列指的是序列中的元素依次递增排列,但不一定连续。
问题分解
创建一个一维数组 dp,其中 dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度。
- 初始化 dp[i] 全部为 1,表示每个元素本身都是一个递增子序列。
- 遍历整个序列,在每个位置 i 上,通过比较之前的元素 j(从 0 到 i-1),如果 nums[i] > nums[j](表示当前位置的元素大于之前的元素),则更新 dp[i] = max(dp[i], dp[j] + 1)。
- 最终,dp 数组的最大值即为最长递增子序列的长度。
注:LIS的解法不是最优解法,这个方法更加体现本质
注解:下面提到的 L I S ( x ) = = 求 x 的最长上升序列 LIS(x)== 求x的最长上升序列 LIS(x)==求x的最长上升序列, L C S ( a , b ) = = 求 a , b 的最长公共序列 LCS(a,b)==求a,b的最长公共序列 LCS(a,b)==求a,b的最长公共序列
转换1
:LIS–>LCS
LIS 问题求的是最长上升子序列,但是什么是上升子序列,上升又是怎么定义的 ?
可以有人会问:上升当然就是1,2,3,4,5这类的呀,这个又有什么好疑惑的呢?
那假如告诉你,2>3>1,那么1,2,3的最长上升子序列是多少?
所以也就是说其实上升是由我们定义的,我们认为上升的定义是1,2,3,4,5,6,7。
− − − − > 代表某种映射 f ( x ) , 经过函数后,元素被赋予某种大小关系 ---->代表某种映射f(x),经过函数后,元素被赋予某种大小关系 −−−−>代表某种映射f(x),经过函数后,元素被赋予某种大小关系
1 , 2 , 3 , 4 , 5 , 6 , 7 ( 定义 ) − − − − − > 1234567 (越大代表相对应位置的元素越大) 1,2,3,4,5,6,7 (定义)-----> 1 2 3 4 5 6 7(越大代表相对应位置的元素越大) 1,2,3,4,5,6,7(定义)−−−−−>1234567(越大代表相对应位置的元素越大)
则刚刚提到的2>3>1,ta的定义就是:
2 , 3 , 1 − − − − − > 1 , 2 , 3 2,3,1 -----> 1,2,3 2,3,1−−−−−>1,2,3
f ( 2 ) = 1 f(2)=1 f(2)=1,说明2是其中最小的元素
f ( 1 ) = 3 f(1)=3 f(1)=3,说明是其中最大的元素
注:后面的所有规则函数都用 f ( x ) = m , m = 1 , 2 , 3 , 4 , 5 , . . . . . f(x)=m,m={1,2,3,4,5,.....} f(x)=m,m=1,2,3,4,5,.....表示。
那么这个关转换1
什么事?
基于上面的想法,我们非常自然推出:
L I S ( x ) = = L C S ( x , m ) , m = 1 , 2 , 3 , 4 , 5 , . . . . . . LIS(x)==LCS(x,m),m={1,2,3,4,5,......} LIS(x)==LCS(x,m),m=1,2,3,4,5,......
有了这条推论后,我们就可以进行证明了。
问题等价于
L C S ( a , b ) < = = = > L I S ( x ) < = = = > L C S ( x , m ) , m = 1 , 2 , 3 , 4 , 5 , 6 , . . . . . LCS(a,b) <===> LIS(x)<===> LCS(x,m), m={{1,2,3,4,5,6,.....}} LCS(a,b)<===>LIS(x)<===>LCS(x,m),m=1,2,3,4,5,6,.....
回想刚刚提到的上升的规则是我们创造的,只不过默认为 1 , 2 , 3 , 4 , 5 , . . . . . 1,2,3,4,5,..... 1,2,3,4,5,.....
现在我们重新定义这个规则:
f ( a ) = m f(a) = m f(a)=m
定理
:函数a,b经过相同的映射空间后,不改变元素的相对顺序
即
f ( b ) = x f(b)=x f(b)=x,x保持自身元素的相对顺序
还是刚刚那个例子:
如规则1:2>3>1,规则2:3>2>1,思考:
条件:在不同的规则下,两个序列大小顺序是1,2,3;2,1,3(1当前位置元素第一小,2代表第当前位置第二小,…),
在规则1下, ( 1 , 2 , 3 ) − − − > ( 1 , 3 , 2 ) , ( 2 , 1 , 3 ) − − > ( 3 , 1 , 2 ) L C S ( a , b ) = 2 (1,2,3)--->(1,3,2),(2,1,3)-->(3,1,2) LCS(a,b)=2 (1,2,3)−−−>(1,3,2),(2,1,3)−−>(3,1,2)LCS(a,b)=2
在规则2下, ( 1 , 2 , 3 ) − − − > ( 1 , 2 , 3 ) , ( 2 , 1 , 3 ) − − − − − > ( 2 , 1 , 3 ) L C S ( a , b ) = 2 (1,2,3)--->(1,2,3),(2,1,3)----->(2,1,3) LCS(a,b)=2 (1,2,3)−−−>(1,2,3),(2,1,3)−−−−−>(2,1,3)LCS(a,b)=2
在定理1
下,也就是证明了
L C S ( a , b ) = L C S ( f ( a ) , f ( b ) ) = L C S ( f ( b ) , m ) = L I S ( f ( b ) ) LCS(a,b) = LCS(f(a),f(b))=LCS(f(b),m)=LIS(f(b)) LCS(a,b)=LCS(f(a),f(b))=LCS(f(b),m)=LIS(f(b))