問題描述
有兩個數字序列,序列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...