該問題的描述略。
lcs問題同樣具有最優子結構(),子問題也出現重疊,但又有所不同——它可以根據條件來排除子問題。
建立乙個二維陣列res來儲存lcs的長度,即res[i][j]表示長度為i的字串x與長度為j的字串y的最長公共子串行的長度。經過分析可以得出如下公式:
res[i][j]=0 i=0或j=0;
res[i-1][j-1]+1若i,j>0且x[i]=y[j];
max(res[i-1][j],res[i][j-1]) 若i,j>0且x[i]!=y[j];
根據這個公式有如下**:
#include#includeusing namespace std;
int lsc(string x, string y)
int m = x.size(), n = y.size();//m,n均大於零。
for (int i = 1; i <= m; i++)
else if (res[i - 1][j] > res[i][j - 1])
else
res[i][j] = res[i][j - 1];
} }return res[m][n];
}int main() ;
string y = ;
cout << lsc (x,y)<< endl;
}
動態規劃之最長公共子串行問題
由最長公共子串行問題的最優子結構性質建立子問題最優值的遞迴關係。用c i j 記錄序列x和y的最長公共子串行的長度,其中,xi yj 當i 0或j 0時,空序列是xi和yj的最長公共子串行。故此時c i j 0。其他情況下,由最優子結構性質可建立遞迴關係如下 void lcslength int m...
動態規劃之最長公共子串行問題
由最長公共子串行問題的最優子結構性質建立子問題最優值的遞迴關係。用c i j 記錄序列x和y的最長公共子串行的長度,其中,xi yj 當i 0或j 0時,空序列是xi和yj的最長公共子串行。故此時c i j 0。其他情況下,由最優子結構性質可建立遞迴關係如下 void lcslength int m...
動態規劃之最長公共子串行
最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x 則另一串行z x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j 0,1,k 1有zj xij。例如序列z 是序列x 的子串行,相應的遞增下標序列維。最長公共子串行問...