继上篇文章“算法:动态规划解 0-1 背包问题”,再发一篇
上篇: http://blog.youkuaiyun.com/span76/article/details/8033953
#include <iostream>
using namespace std;
char a[]="abecd";
char b[]= "abcd";
char result[512];
int rIdx = -1;
int max2 = 0;
int find(char a[], char b[], int aIdx, int bIdx) {
if ( aIdx < 0 || bIdx < 0) {
int tIdx = rIdx;
if( max2 < tIdx+1 ){
max2 = tIdx+1;
while (tIdx>=0)
cout << result[tIdx--]; // 打印最长的串, 当然如果后来发现更长的也会打印
cout<< endl;
}
return 0;
}
if ( a[aIdx] == b[bIdx] ) {
result[++rIdx] = a[aIdx]; // 为了打印
int ret = 1 + find(a,b, aIdx-1, bIdx-1);
result[--rIdx]; // 递归的魅力在于能复原现场, 如果匹配,没有找到的最长串, 现场还是会被恢复
return ret;
}
else { // 对比下面的两种情况
int m = find(a,b, aIdx-1, bIdx);
int n = find(a,b, aIdx, bIdx-1);
return m>n? m: n; // 取最优,体现动态规划的特点
}
}
int main() {
cout << "!!!Max Common String!!!" << endl;
int aLen = strlen(a);
int bLen = strlen(b);
cout << "1:" << a << endl;
cout << "2:" << b << endl;
int maxLen = find(a,b,aLen-1, bLen-1 );
cout << endl << "max len is " << maxLen ;
return 0;
}