描述
ben和mei在做乙個專案。現在他們遇到了乙個難題,需要你的幫助。問題可以抽象為,給定兩個整型數串,求它們的最長公共子串行。最長公共子串行的定義是,乙個數列 s ,如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
輸入
輸入包含多組測試資料,每組資料首先包含乙個n和乙個m,分別表示兩個整型串的長度,接下來是兩行資料,分別有n個和m個整數(0
輸出
對每組資料,請輸出它們最長公共子串行的長度。
樣例輸入
7 81 3 4 6 7 5 4
1 6 3 4 8 7 5 6
8 71 2 3 1 2 3 1 2
1 3 2 3 2 3 2
樣例輸出5
6提示
樣例一的最長公共子串行:1 3 4 7 5,長度為5
樣例一的最長公共子串行:1 2 3 2 3 2,長度為6
本題算是我第一次遇到dp,問了度娘,看了下別人的**,半懂半猜的a了這道題。
這算是dp中最水的一道題了,主要思路就是開兩個一維陣列存這兩個序列,再開乙個二維陣列來存放進行到每一步當前的最長公共子串行的長度,用兩個迴圈來將每乙個可能的序列都計算一遍本來如果題目要求輸出最長的那個序列就還要回溯的,但是最後只要求輸出序列的長度,故打出最後的那個陣列存的量即可。
演算法的遞迴式
回溯輸出最長公共子串行過程:
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...
最長公共子串 最長公共子串行
子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...