日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

奇妙的算法之LCS妙解

發布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 奇妙的算法之LCS妙解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??????????????????????????????????????????????????????????????????????LCS算法妙解

LCS問題簡述:最長公共子序列

一個數列 S,如果分別是兩個或多個已知數列的子序列,且是所有符合此條件序列中最長的,則S 稱為已知序列的最長公共子序列。

LCS問題的分支:最長公共子串與最長公共子序列

子串(Substring)是串的一個連續的部分,子序列(Subsequence)則是從不改變序列的順序,而從序列中去掉任意的元素而獲得的新序列;更簡略地說,前者(子串)的字符的位置必須連續,后者(子序列LCS)則不必。比如字符串acdfg同akdfc的最長公共子串為df,而他們的最長公共子序列是adf。

LCS解題策略:

one:窮舉法。。。復雜度不再多說,想想2的N次方就感到可怕;

two:矩陣,也就是動態規劃節LCS問題,也就是今天咱的標題;

下面來細講the twith idea:

?

?由此圖可以看出此經典算法的思路;

下面是代碼,方便大家理解:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX(a,b) (a>b?a:b)
 4 const int MAXN=1010;
 5 int dp[MAXN][MAXN];
 6 char a[MAXN],b[MAXN];
 7 int main(){
 8 while(~scanf("%s%s",a+1,b+1)){
 9     memset(dp,0,sizeof(dp));
10     int i,j;
11     for( i=1;a[i];i++){
12         for(j=1;b[j];j++){
13             if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;
14             else dp[i][j]=MAX(dp[i][j-1],dp[i-1][j]);
15         }
16     }
17     printf("%d\n",dp[i-1][j-1]);
18 }
19 return 0;}

此遞歸關系為:

  1. 若xm=yn,則zk=xm=yn且Zk-1是Xm-1和Yn-1的最長公共子序列;
  2. 若xm≠yn且zk≠xm ,則Z是Xm-1和Y的最長公共子序列;
  3. 若xm≠yn且zk≠yn ,則Z是X和Yn-1的最長公共子序列。

此算法時間復雜度為n*m,空間復雜度也是n*m;

另外若要記錄路徑就比較復雜了;

lcs解決lis問題:

需要先排序,然后與原數組求最長公共子序列;

下面是道題poj上的,就用到了此題的思想:

Common Subsequence
Time Limit: 1000MS?Memory Limit: 10000K
Total Submissions: 43194?Accepted: 17514

Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming    contest 
abcd           mnp

Sample Output

4
2
0

還有南陽oj上面有道最長公共子序列更是LCS的模板;

轉載于:https://www.cnblogs.com/handsomecui/p/4717444.html

總結

以上是生活随笔為你收集整理的奇妙的算法之LCS妙解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。