這個題的意思就是說:
給乙個序列 a 和 b ,讓你求他們的共同的子串行的長度,這些子串行可以不在原來的字串中連續排列。
這個題的話,我們可以使用動態規劃的思路,我們假設 maxlen [ i ] [ j ] 是 a 串和 b 串中從一開始的,a 串中的的第 i 個字元和b 串中的第 j 個字元的最長公共子串行的長度。
我們可以知道 maxlen[i][0]是0,並且 maxlen[0][j]也是0,這是邊界條件。
然後對於以後的如果 a串的第 i個字元和 b串的第 j個字元相等的話,我們就可以讓 maxlen [i][j]加一,如果不相等的話我們就從
maxlen[i][j-1] 和maxlen[j][i-1]中選乙個大的出來作為它的值。
對於乙個不做證明,第二個也很好證明,主要是因為,既然 maxlen [i][j] 不大於maxlen [i][j-1]和 maxlen [i-1][j],並且 maxlen [i][j]
不小於 maxlen [i][j-1] 和 maxlen [i-1][j] ,所以,他們可以說是相等的關係。
怎麼證明這個,對於不小於不再作證明了,不大於的話我們用反證就可以了。
因為如果它大於 減一 這個類的話,說明,第 i 個字元起作用了,因為 i-1 並沒有這個字元,說明它就是最後乙個字元,同理 j-1也是最後乙個字元,既然他們都是最後乙個字元,並且都起了作用, 說明他們相等,而我們的前提是 i-1 不等於 j-1,所以推出矛盾,假設不成立。
#include #include using namespace std;
char sz1[1000];
char sz2[1000];
int maxlen[1000][1000];
using namespace std;
int main()
for (int j=0;j<=len2;j++)
for (int i=1;i<=len1;i++)
else
}} cout<} return 0;
}
poj 1458 最長公共子串行
common subsequence 題意 一行給出兩個字串s1和s2,找出他們的最長 公共子串行數量,乙個金典的動態規劃問題。用dp i j 表示字串s1取前i個,字串s2取前j個時,他們的最長公共子串行數量有多少。當s2右端又加入了乙個字元時,即表示為dp i j 1 時,如果s1 i 和s2 ...
POJ1458最長公共子串行
為了完成poj中的一題 spell checker 要寫乙個最長公共子串行的程式,居然突然全給忘了,楞是沒有寫出來,深深的鄙視自己一下。這也是一道動態規劃的典型題。遞迴實現如下 poj提交會超時,但是確實可以實現 using namespace std define max a b a b a b ...
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 邊界比較麻煩,你...