码迷,mamicode.com
首页 > 其他好文 > 详细

最长公共子序列和最长递增子序列

时间:2015-02-24 17:25:49      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

1、最长公共子序列:(x和y是两个数组的长度)

f(x,y) = 0                               if(x==0 || y==0)

            f(x-1,y-1)+1               if(A[x-1]==B[y-1])

           max{f(x-1,y), f(x,y-1)} if(A[x-1]!=B[y-1])

2、最长递增子序列

(1) 最长公共子序列法:排序后与原数组的最长公共子序列。

(2) 动态规划法:(时间复杂度O(N^2))

设长度为N的数组为{a0,a1, a2, ...an-1),则假定以aj结尾的数组序列的最长递增子序列长度为L(j),则L(j)={ max{1,L(i)+1}, i<j且a[i]<a[j] }。也就是说,我们需要遍历在j之前的所有位置i(从0到j-1),找出满足条件a[i]<a[j]的L(i),求出max(L(i))+1即为L(j)的值。最后,我们遍历所有的L(j)(从0到N-1),找出最大值即为最大递增子序列。时间复杂度为O(N^2)。
例如给定的数组为{5,6,7,1,2,8},则L(0)=1, L(1)=2, L(2)=3, L(3)=1, L(4)=2, L(5)=4。所以该数组最长递增子序列长度为4,序列为{5,6,7,8}。算法代码如下:

int lis(int arr[], int len)
{
int longest[len];
for (int j = 1; j < len; j++) {
   longest[i] = 1;
for (int i = 0; i < j; i++) { if (arr[j] > arr[i] && longest[j] < longest[i] + 1) { longest[j] = longest[i] + 1; } } } int max = 0; for (int i = 0; i < len; i++) { if (longest[i] > max) max = longest[i]; } return max; }

(3) 

最长公共子序列和最长递增子序列

标签:

原文地址:http://www.cnblogs.com/litao-tech/p/4298756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!