算法: 动态规划解最长公共子串

来源:互联网 发布:淘宝店铺页面设计图片 编辑:程序博客网 时间:2024/05/12 02:31

继上篇文章“算法:动态规划解 0-1 背包问题”,再发一篇

上篇: http://blog.csdn.net/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;}
原创粉丝点击