POJ1458最長公共子串行

2021-08-26 17:09:06 字數 804 閱讀 9540

為了完成poj中的一題(spell checker),要寫乙個最長公共子串行的程式,居然突然全給忘了,楞是沒有寫出來,深深的鄙視自己一下。

這也是一道動態規劃的典型題。

遞迴實現如下(poj提交會超時,但是確實可以實現):

using namespace std; #define max( a ,b ) ((a)>(b)?(a):(b)) //最長公共子串行 int maxlen( char *a, char *b) if( *a != '\0' && *b != '\0') return len + max( maxlen( a + 1, b), maxlen( a, b + 1) ); return len; } int main()

下面這個程式用到了動態規劃(所謂動態規劃就是將乙個問題分解成為子問題遞迴求解,並且將中間結果儲存以避免重複計算,關鍵就是1.找邊界,2.找狀態轉移公式)。此例乃動態規劃的典型題。具體實現如下:

#includeusing namespace std; #define max 1000 int ndata[ max ][ max ]; //最長公共子串行 /* 遞推公式: if( i == 0 || j == 0 ) maxlen( i, j ) = 0; else if( s1[i] == s2[j]) maxlen( i, j) = maxlen( i - 1, j -1) + 1; else maxlen( i, j) = max( maxlen(i, j - 1 ), maxlen( i - 1, j)); */ int main() } printf("%d\n", ndata[ nlength1][nlength2]); } return 0; }

poj 1458 最長公共子串行

common subsequence 題意 一行給出兩個字串s1和s2,找出他們的最長 公共子串行數量,乙個金典的動態規劃問題。用dp i j 表示字串s1取前i個,字串s2取前j個時,他們的最長公共子串行數量有多少。當s2右端又加入了乙個字元時,即表示為dp i j 1 時,如果s1 i 和s2 ...

POJ 1458 最長公共子串行

這個題的意思就是說 給乙個序列 a 和 b 讓你求他們的共同的子串行的長度,這些子串行可以不在原來的字串中連續排列。這個題的話,我們可以使用動態規劃的思路,我們假設 maxlen i j 是 a 串和 b 串中從一開始的,a 串中的的第 i 個字元和b 串中的第 j 個字元的最長公共子串行的長度。我...

poj1458(最長公共子串行問題)

問題描述 給a,b兩個字串,讓你找出最長公共子串行的長度的問題 解題思路 dp 狀態變數 d i j 表示以ai和bj為結尾的字串的最長公共子串行的長度 狀態方程 當a i 等於b j 時d i j d i 1 j 1 1 不等時 d i j max d i 1 j d i j 1 邊界比較麻煩,你...