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

2021-09-19 01:10:50 字數 1773 閱讀 1125

**【問題描述】**使用動態規劃演算法解最長公共子串行問題,具體來說就是,依據其遞迴式,自底向上的方式依次計算得到每個子問題的最優值。

**【輸入形式】**在螢幕上輸入兩個序列x和y,序列各元素數間都以乙個空格分隔。

**【輸出形式】**矩陣c,其中c(i,j)中存放的是:序列xi = 和序列yj = 的最長公共子串行的長度。序列x和y的最長公共子串行。

【樣例輸入】

a b c b d a b

b d c a b a

【樣例輸出】

[[0 0 0 0 0 0 0]

[0 0 0 0 1 1 1]

[0 1 1 1 1 2 2]

[0 1 1 2 2 2 2]

[0 1 1 2 2 3 3]

[0 1 2 2 2 3 3]

[0 1 2 2 3 3 4]

[0 1 2 2 3 4 4]]

bcba

【樣例說明】

輸入:第一行輸入序列x的各元素,第二行輸入序列y的各元素,元素間以空格分隔。

輸出:矩陣c,和序列x和y的最長公共子串行。

【評分標準】根據輸入得到準確的輸出。

python實現:

import numpy as np

def lcs_length(x, y, m, n, b, c):

for i in range(1, m+1):

c[i, 0] = 0

for j in range(1, n+1):

c[0, j] = 0

for i in range(1, m+1):

for j in range(1, n+1):

if x[i] == y[j]:

c[i, j] = c[i-1, j-1]+1

b[i, j] = 1

elif c[i-1, j] >= c[i, j-1]:

c[i, j] = c[i-1, j]

b[i, j] = 2

else:

c[i, j] = c[i, j-1]

b[i, j] = 3

def print_lcs(b, x, i, j):

if i == 0 or j == 0:

return

if b[i, j] == 1:

print_lcs(b, x, i-1, j-1)

print(x[i], end="")

elif b[i, j] == 2:

print_lcs(b, x, i-1, j)

else:

print_lcs(b, x, i, j-1)

def main():

x = list(input().split())

y = list(input().split())

m = len(x)

n = len(y)

x.insert(0, 0)

y.insert(0, 0)

b = np.zeros((m + 1, n + 1), dtype=np.int8)

c = np.zeros((m + 1, n + 1), dtype=np.int8)

lcs_length(x, y, m, n, b, c)

print(c)

print_lcs(b, x, m, n)

if __name__ == '__main__':

main()

最長公共子串行 動態規劃

經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所...

最長公共子串行 動態規劃

關於用動態規劃法求兩個序列的最長公共子串行問題的相關知識見 王曉東 計算機演算法設計與分析 第三章。注意,這裡所指的最長公共子串行是可以不相鄰的,與平常所說的最長公共子串 相鄰的 不一樣。直接上 lcs.h ifndef lcs h define lcs h class lcstring endif...

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

定義 乙個數列 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 稱為已知序列的最長公共子串行。考慮最長公共子串行問題如何分解成子問題,設a a0,a1,am 1 b b0,b1,bm 1 並z z0,z1,zk 1 為它們的最長公共子串行。不難證明有以下性質 1 如果am ...