最長共公子序列 LCS

2022-08-04 09:54:11 字數 1651 閱讀 2240

1 #include 2 #include 3 #include 4

using

namespace

std;

5char str1[55], str2[55];6

int f[55][55];//

記錄狀態 7//

動態規劃是一種記憶化搜尋 8/*

有倆個字串,求出他們的最長公共子串行

9,例如:

10acdtfs

11aldtks

12最長公共子串行是adts,長度為4

13n,m

14string1(length = n)

15string2(length = m)

16f[i][j]表示1串第i個與第二個串第j個匹配得到

17的子串行最大長度

18f[i][j] = max(f[i - 1][j], f[i][j - 1]);

19f[i - 1][j - 1] + 1;

20*/

21int

main()

32 f[i][j]=max(f[i][j], f[i-1

][j]);

33 f[i][j]=max(f[i][j], f[i][j-1

]);

34} 35}

36 printf("

%d\n

", f[n][m]);

37return0;

38 }

1 #include 2

using

namespace

std;3/*

有一串數,求出它的最大不下降子串行的

4長度(等於也包括)

5如1, 2, 5, 3, 6, 2, 9, 10

6答案是

71 2 3 6 9 10(這只是其中之一)

8f[i]表示子串行包括數字i的時候,最長不下降子串行的長度

9f[i] = max(f[j] + 1) a[i] > a[j];

10ans = max(f[i])

11*/

12int a[222

];13

int f[222

];14

int memory[222];//

記錄狀態

15int

main()

22int

temp;

23 f[1] = 1;//

第乙個為1

24for(i = 2; i <= n; i++)

32} 33}

34}35int ans = 0, mark;//

mark用來取得記錄最大不下降子串行的下標,ans用來記錄大子串行的值

36for(i = 1; i <= n; i++) 41}

42 temp =mark;

43//

倒序輸出記錄狀態 (這裡可以利用乙個棧順序輸出)

44while(temp > 0

)48 printf("

\n%d\n

", ans);

49return0;

50 }

最長公共子串行的優秀博文:

最長共公子序列 LCS

1 include 2 include 3 include 4 using namespace std 5char str1 55 str2 55 6 int f 55 55 記錄狀態 7 動態規劃是一種記憶化搜尋 8 有倆個字串,求出他們的最長公共子串行 9,例如 10acdtfs 11aldtk...

最長子序列LCS演算法

問題描述 給定兩個序列x,y,求這兩個序列的最長公共子串行 主要思想 動態規劃 解析 子串行 即序列中,下標按照嚴格遞減所形成的序列即為子串行,比如 x 那麼 acb也是該序列的子串行 子串行可以有很多,但是最長子序列的長度是應該唯一的。推論 1 如果xi yj,那麼zk xi yj,則zk 1 x...

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...