今天研究了一下動態規劃,思想很簡單:循序漸進,區域性推到整體。但運用起來還是不太好想的。
下面用動態規劃解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個序列的子串行...