最長公共子串行

2021-09-20 10:24:41 字數 1155 閱讀 7964

問題描述

有兩個數字序列,序列x和序列y,求這兩個序列的最長公共子串行。

輸入格式輸入

第一行,兩個不超過500的整數,表示兩個序列的長度。

接下來有兩行,第一行有空格間隔的x個整數,表示序列x

第二行有空格間隔的y個整數,表示序列y (序列x,y中的整數大小不超過200)

輸出格式輸出

輸出檔案第一行為乙個非負整數,表示所求得的最長公共子串行長度

樣例輸入

7 615 10 7 10 3 15 10

10 3 7 15 10 15 

樣例輸出

/*

狀態:f[i][j]表示x陣列的前i個與y陣列的前j個中最長公共子串行的長度

方程:1.當x[i] == y[j]:

f[i][j] = f[i - 1][j - 1] + 1

(f[i - 1][j - 1]表示x陣列的前i - 1個與y - 1陣列的前j個中最長公共子串行的長度

再加當前相同的x[i]與y[j]這乙個)

其他:f[i][j] = max(f[i][j - 1], f[i - 1][j])

(f[i][j - 1]表示x陣列的前i個與y陣列的前j - 1個中最長公共子串行的長度)

(f[i - 1][j]表示x陣列的前i - 1個與y陣列的前j個中最長公共子串行的長度)

(再選最大值)

邊界:(1) 1 <= i <= n

(2) 1 <= j <= m

問題:1.注意陣列大小

*/#include using namespace std;

int x[500 + 5] = ;

int y[500 + 5] = ;

int f[500 + 5][500 + 5] = ;//1

int main()

for(int i = 1; i <= m; i++)

for(int i = 1; i <= n; i++)

else

} }printf("%d", f[n][m]);

return 0;

}

最長公共子串行 最長公共子串

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...