动态规划--(最长公共子序列 poj1458)

来源:互联网 发布:mac chrome 书签位置 编辑:程序博客网 时间:2024/06/05 02:51

给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。


Sample Input

abcfbc abfcab

programming contest

abcd mnp

Sample Output

4

2


#include <iostream>#include<cstring>#define NUM 1001using namespace std;char A[NUM];char B[NUM];int result[NUM][NUM];    //递归方法int Maxlen(int n,int m){    if(n<0||m<0)        return 0;    if(n==0&&m==0&&A[0]==B[0])        return 1;        //各种边界条件的计算;    if(n==0&&m==0)        return 0;    if(result[n][m]> 0)        return result[n][m];    if(A[n]==B[m]){        result[n][m]= Maxlen(n-1, m-1)+1;//如果上下相等;;就将个数加1;    }    else{        int y = Maxlen(n-1, m);//如果,上下不相等,就将上或者是下移动一个,移动以后如果有相等的就将相等的个数数出来,        int z = Maxlen(n, m-1);//观察两个的个数哪一个大,用那一个;        result[n][m] = max(y, z);    }    return result[n][m];}int main2(){    int N = 0,M = 0;    while(cin>>A>>B){        N = (int)strlen(A);        M = (int)strlen(B);        for(int i = 0;i<NUM;i++){            for(int j = 0;j<NUM;j++)                result[i][j] = -1;        }//储存结果数组;        cout <<Maxlen(N-1, M-1)<<endl;        for(int i = 0;i<NUM;i++){            for(int j = 0;j<M;j++)                cout <<result[i][j]<<" ";            cout <<endl;        }    }    return 0;}    //递推方法int main(){    char a[100];    char  b[100];    int result[2][100];//表示计算到我这儿的时候最大的子序列是多少;;;    int N;    cin>>N;    cin>>a>>b;    while(N--){        int n = (int)strlen(a);        int m = (int)strlen(b);        result[1][0] = 0;        for( int j = 0;j <= m; j ++ )            result[0][j] = 0;            //初始化;;;;很重要;;;;        for( int i = 1;i<=n;i++){            for(int j = 1;j<=m;j++){                if(a[i-1] == b[j-1]){//做判断;;                    result[i%2][j] = result[(i-1)%2][j-1]+1;                }                else{                    result[i%2][j] = max(result[(i-1)%2][j],result[i%2][j-1]);                }            }//            for(int i = 0;i<=1;i++){//                for(int j = 0;j<=m;j++)//                    cout <<result[i][j]<<" ";//                cout <<endl;//            }//测试        }        cout<<result[1][m]<<endl;    }        return 0;}


原创粉丝点击