1. 程式人生 > >動態規劃---求最長公共子序列

動態規劃---求最長公共子序列

直接看題:
對於兩個字串,請設計一個高效演算法,求他們的最長公共子序列的長度,這裡的最長公共子序列定義為有兩個序列U1,U2,U3…Un和V1,V2,V3…Vn,其中Ui&ltUi+1,Vi&ltVi+1。且A[Ui] == B[Vi]。

給定兩個字串A和B,同時給定兩個串的長度n和m,請返回最長公共子序列的長度。保證兩串長度均小於等於300。

題意就是說,給出兩個字串,然後找出這兩個字串中公共序列的長度,比如說如下兩個字串,
“1A2C3D4B56”,10,”B1D23CA45B6A”,12
這裡寫圖片描述
返回的就是6

直接上程式碼

int findLCS(string A, int
n, string B, int m) { // write code here vector<int> v(m+1,0); vector<vector<int>> res(n+1,v);//使用一個二維陣列來存放結果 for(int i = 1;i<=n;i++) { for(int j = 1;j<=m;j++) { if(A[i-1] == B[j-1])//開闢的vector是要比原本的字串長度要大的
res[i][j] = res[i-1][j-1]+1; else res[i][j] = max(res[i-1][j],res[i][j-1]); } } return res[n][m]; }

動態規劃的主要思想就是將問題準成一個個交叉的子問題。直接去求這個兩個字串的最長序列不好求,那麼我們可以先求出前邊部分的最長序列,再根據前邊的一步步求下去,直到將兩個目標串都包含進去。