動態規劃解LCS問題

2021-06-25 13:56:50 字數 1640 閱讀 4835

今天研究了一下動態規劃,思想很簡單:循序漸進,區域性推到整體。但運用起來還是不太好想的。

下面用動態規劃解lcs最大公共子串問題

寫了兩個函式lcs和lcs_inhance,前者用矩陣實現(用於理解原理),後者用兩個陣列實現(節省空間)。

**如下:

#include#includeusing namespace std;

int max(int x, int y, int z)

int lcs(const string& s1,const string& s2)

map[i][0] = 0;

} for (int i = 0; i < s2.size(); ++i)

map[0][i] = 0; }

for (int i = 1; i < len_min; ++i)

for (int j = i; j < s2.size(); ++j)

} int tep= map[s1.size() - 1][s2.size() - 1];

for (int i = 0; i < s1.size(); ++i)

delete map[i];

return tep;

}int lcs_inhance( char* s1, char* s2)

int h = strlen(s1);

int l = strlen(s2);

int *pl = new int[l];

int *ph = new int[h];

for (int i = 0; i < l; ++i)

pl[i] = 0;

} for (int i = 0; i < h; ++i)

ph[i] = 0;

} for (int i = 1; i < h; ++i)

else

for (int j = i+1; j < l; ++j)

else

} for (int j = i + 1; j < h; ++j)

else

} }//cout << pl[l - 1] << '\t' << ph[h - 1] << endl;

int result = pl[l - 1];

delete pl, ph;

return result;

}int main(){

file* pf;

freopen_s(&pf, "c:\\acm_input.txt", "r",stdin);

string s1, s2;

int input_num = 4;

for (int i = 0; i < input_num; ++i){

cin >> s1 >> s2;

cout << lcs(s1, s2) << endl;

char *ps1 = new char[s1.size() + 1];

char *ps2 = new char[s2.size() + 1];

ps1[s1.size()] = '\0';

ps2[s2.size()] = '\0';

strncpy(ps1, s1.c_str(), s1.size());

strncpy(ps2, s2.c_str(), s2.size());

cout<

LCS問題 動態規劃

簡述 lcs問題,即最長公共子串行問題,給定兩個序列x 和y 求x y最長的公共子串行。與lis類似,lcs也是可以不連續的。解題思路 本人覺得在這個問題上演算法導論講的很好,所以在此我主要是整理。1 首先我們來考慮暴力搜尋求解的方法,我們要暴力列舉x的所有子串行,然後再看看是不是也是y的子串行,這...

動態規劃 LCS計算

int findlcs string a,int n,string b,int m dp的第一行 for int j 0 j m 1 j 其他位置的dp值 for int i 1 i n 1 i else dp i j dp i 1 j dp i j 1 dp i 1 j dp i j 1 retu...

動態規劃解最長公共子串行 LCS

子串行形式化定義 給定乙個序列x 另乙個序列z 若存在乙個嚴格遞增的x的下標序列對所有的1,2,3,k,都滿足x ik zk,則稱z是x的子串行 比如z 是x 的子串行 公共子串行定義 如果z既是x的子串行,又是y的子串行,則稱z為x和y的公共子串行 最長公共子串行 以下簡稱lcs 2個序列的子串行...