NYOJ 36 最長公共子串行 動態規劃

2021-06-21 11:41:02 字數 2240 閱讀 8047

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:3 描述

咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。

tip:最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。

輸入第一行給出乙個整數n(0

輸出每組測試資料輸出乙個整數,表示最長公共子串行長度。每組結果佔一行。

樣例輸入

2

asdf

adfsd

123abc

abc123abc

樣例輸出

3

6

動態規則經典題,詳細講解參考演算法 導論p208。

01.#include

02.#include

03.usingnamespacestd;

04.

05.intc[1002][1002];

06.

07.voidlcs(string &a,string &b,intn,intm)

08.

24.}

25.

26.}

27.

28.intmain()

29.

39.return0;

40.}

然而上面的演算法空間複雜度還是挺大的,演算法導論書中習題要求只用min(m,n)+o(1)的空間完成。於是就有了如下的演算法:

只用一維陣列dp[n]。

old 變數是用來表示dp[i-1][j-1],dp[j-1]表示dp[i][j-1],dp[j]表示dp[i-1][j]。

比如,當我們開始處理i=4的時候,從j=1開始,一開始old表示dp[3][0],肯定為0。然後用臨時變數tmp記下這時的dp[j]這時的dp[j]還沒有被改變,也就是說,這裡的dp[j]還是i=3的時候求得的dp[j],而其對於j+1來說就是dp[i-1][j-1]。此時的dp[j]對當前的j來說,就是dp[i-1][j],而dp[j-1]已經在 j的前一刻被處理過了,也就等階於dp[i][j-1]。over。

#include

02.#include

03.#include

04.usingnamespacestd;

05.

06.intdp[1001];

07.

08.intmain()

09.

31.}

32.cout<

33.}

34.return0;

35.}

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

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分...

nyoj36最長公共子串行 動態規劃

tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。接下來每組資料兩行,分別為待測的兩組字串。...

NYOJ 36 最長公共子串行 動態規劃基礎

時間限制 3000 ms 記憶體限制 65535 kb 難度 3描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。tip 最長公共子串行也稱作最長公共子串 不要求連續 英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別...