時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3 描述
咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。
tip:最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
輸入第一行給出乙個整數n(0
輸出每組測試資料輸出乙個整數,表示最長公共子串行長度。每組結果佔一行。
樣例輸入
2asdf
adfsd
123abc
abc123abc
樣例輸出
36
動態規則經典題,詳細講解參考演算法 導論p208。
01.
#include
02.
#include
03.
using
namespace
std;
04.
05.
int
c[1002][1002];
06.
07.
void
lcs(string &a,string &b,
int
n,
int
m)
08.
24.
}
25.
26.
}
27.
28.
int
main()
29.
39.
return
0;
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.
using
namespace
std;
05.
06.
int
dp[1001];
07.
08.
int
main()
09.
31.
}
32.
cout<
33.}
34.
return
0;
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 如果分別...