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

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


Sample Input

abcfbc abfcab

programming contest

abcd mnp

Sample Output

4

2


#include <iostream>
#include<cstring>
#define NUM 1001

using 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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值