動態規劃之最長公共子串行(lcs)

2021-04-15 14:50:56 字數 535 閱讀 6306

最長公共子串行的定義是,乙個數列z分別是已知數列的子串行(子串行不一定是連續序列,是在該序列中刪去若干元素後得到的序列),且是所有符合此條件序列中最長的,則z成為最長公共子串行lcs(longest common subsequences)。有些地方則說公共子串就是要求連續的子串行,有些地方則不是,這裡要注意區分。下面是完整實現**。

#include

using namespace std;

void lcs_length(char *x,char *y,int **b,int m,int n)

//當前字元不相同,且x陣列後退一步(即c[i-1][j])比y陣列後退一步(即c[i][j-1])

//所得到的公共子串行的長度要長,隱含的意思是當前最長公共子串行可以不需要x[i-1]

else if(c[i-1][j]>=c[i][j-1])

//和上面分析類似

else}}

for(int i=0;i//列印結果

void print_lcs(int **b,char *x,int i,int j)

動態規劃之 最長公共子串行 LCS

這個問題是動態規劃演算法中的乙個經典問題,先看問題描述 lcs 兩個字串 x和 y,找到他們最長的公共子串行,該序列不要求是連續的。公共子串行的意思就是序列的相對順序是不變的,但是序列不一定是連續的。例如 x bdcaba y abcbdab 他們的最長公共子串行是bcba和bdab,長度都為4,找...

動態規劃之最長公共子串行(LCS)

動態規劃之最長公共子串行問題 前言 乙個給定序列的子串行,就是將給定的序列中零個或多個元素去掉後得到的結果。其形式化定義如下 給定乙個序列x 另乙個序列z 滿足如下條件時稱為x的子串行,即存在乙個嚴格遞增的x下表序列 i1,i2 ik 對所有j 1,2,3,k滿足xi zj例如z 是x 的子串行對應...

動態規劃之最長公共子串行(LCS)

動態規劃法 dynamic programming 通常用於求解最優化問題 optimization problem 它適用於最優子結構和重疊子問題。這顯然與分治法是不同的,分治法將問題劃分為不重疊的子問題,然後分別求解這些子問題,最後將這些問題合併得到最終的解。對於具有公共子問題的情況,分治法會做...