给定两个字符串,求出这两个字符串的最长公共子序列的长度。
输入
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;
}