给定两个字符串,求出这两个字符串的最长公共子序列的长度。

输入

abcd
becd

输出
3(bcd)

分析:

我们定义:
dp[i][j],S1···Si和T1···Tj对应的最长公共子序列的长度
当Si+1=Tj+1时,在S1···Si和T1···Tj对应的最长公共子序列的末尾追加上Si+1
S1···Si和T1···Tj+1对应的最长公共子序列
S1···Si+1和T1···Tj对应的最长公共子序列

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int n,m;
int dp[100][100];
char ch1[100],ch2[100];
void solve()
{
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
        {
            if(ch1[i]==ch2[j])
                dp[i+1][j+1]=dp[i][j]+1;
            else
                dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
        }
}
int main()
{
    scanf("%s %s",ch1,ch2);
    n=strlen(ch1);
    m=strlen(ch2);
    memset(dp,0,sizeof(dp));
    solve();
    printf("%d\n",dp[n][m]);
    return 0;
}
posted on 2017-07-17 11:54  渡……  阅读(202)  评论(0编辑  收藏  举报