動態規劃 最長公共子串行

2021-09-26 05:10:08 字數 1850 閱讀 5940

最長公共子串行問題

有序列x(長為m), y(長為n), 子串行定義為在序列中元素嚴格遞增的序列,但是不要求連續,求x和y的最長公共子串行

eg. x為』abcbdab』, y為』bdcaba』, 最長公共子串行為』bcba』

#coding=utf-8

'''子問題界定:

x的終止位置為i,y的終止位置為j

c[i,j]代表此時x和y的最長公共子串行長度

b[i,j]標記下乙個子問題的移動方向(0:↑,1:↖,2:←)

'''import numpy as np

deflcs

(x,y,m,n)

: c = np.zeros(

(m,n)

) b = np.zeros(

(m,n)

)for i in

range

(m):

if x[i]

== y[0]

: c[i][0

]=1 b[i][0

]=1for j in

range

(n):

if x[0]

== y[j]

: c[0]

[j]=

1 b[0]

[j]=

1for i in

range(1

,m):

for j in

range(1

,n):

if x[i]

==y[j]

: c[i]

[j]= c[i-1]

[j-1]+

1 b[i]

[j]=

1elif c[i]

[j-1

]>= c[i-1]

[j]:

c[i]

[j]= c[i]

[j-1

] b[i]

[j]=

2else

: c[i]

[j]= c[i-1]

[j] b[i]

[j]=

0return c,b

#(0:↑,1:↖,2:←)

deftrack_solution

(x,m,n,b)

: x = b[m-1]

[n-1

] i,j = m-

1,n-

1 ls_x =

while

(i>=

0and j>=0)

:if x==1:

) i,j = i-

1,j-

1elif x==0:

i = i-

1else

: j = j-

1 x = b[i]

[j]return ls_x

if __name__ ==

'__main__'

: x =

'abcbaab'

y ='bdcaba'

c,b = lcs(x,y,7,

6)print

(c)print

(b) ls_solution = track_solution(x,7,

6,b)

ls_solution.reverse(

)print

(ls_solution)

動態規劃 最長公共子串行

問題描述 我們稱序列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的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...

動態規劃 最長公共子串行

看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...