CSU 1078 「最長公共子串行」

2021-07-04 06:58:24 字數 1275 閱讀 3664

time limit: 1 sec  

memory limit: 128 mb

submit: 304  

solved: 61 [

submit][

status][

web board]

輸入包含多組測試資料。

對於每組測試資料,第一行包含兩個正整數n (2<=n<=10)、m (1<=m<=1000),表示一共有n個整數序列,且每個序列均包含有m個不同的非負整數。接下來一共有n行,每行均包含m個不同的非負整數(這些整數不大於10^9),這n行分別描述了這n個整數序列。

對於每組測試資料,用一行輸出乙個整數表示這n個序列的最長公共子串行一共包含多少個整數。

2 3

1 2 3

1 2 3

3 31 2 3

2 3 1

3 1 2

3

1

csu monthly 2012 jun.

目前遇到的最棘手的字串長度問題

本來以為這個題目必須要o(m^n)

但是實際上資料不允許,而且題目中有乙個非常重要的條件

每個串中沒有重複數字,因此就可以這樣處理(題目引號的意義所在)

把數字在各個串中出現的次數和位置統計下來

出現次數不足串的數量的情況直接去掉

剩下的按照出現位置求乙個lics最長公共上公升子串行

(乙個數字在各個串中出現的位置分別嚴格大於另乙個數字在各個串出現的位置)

複雜度變成o(n^2*m)大大降低,而且空間複雜度也大大下降了

最後注意乙個小問題如果沒有所有串都相同的數字,則應該輸出0

還有一次是wa在了串的開頭可以是任意乙個數字……

//注意題目陳述的沒有重複數字,

//因此這個問題不再是乙個傳統意義的公共子串行問題

#include #include #include using namespace std;

const int m=11;

const int mn=1005;

int num[m][mn]; //感覺這個好像開多餘了……並不需要這麼大

int numn[mn][m];

int numnn[mn]; //儲存相同數字個數

int dp[mn];

int main()

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

for(int j=1;j<=m;j++)}}

for(int i=m;i>=1;i--)

}//cout<

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

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