题目大意:
给定两个字符串序列,输出其中包含的最长的子序列的长度。
输入的两个对比的字符串以若干空格分割(这就涉及到了读入两个字符串的技巧)
输出:最长公共子序列的长度
LCS问题,经典的动态规划问题
从c[i][j]={0 //当i=0或者j=0;
c[i-1][j-1]+1 //当 i,j>0 并且xi=yj;
max{c[i[-][j],c[i][j-1]} //当i,j>0 并且 xi与yj不等}
代码如下:
# include <iostream>
using namespace std;
char s1[1000];
char s2[1000];
int c[1001][1001];
int main()
{
/*char s1[1000];
char s2[1000];
int c[1001][1001];*/
while(scanf("%s",s1+1)!=EOF)
{
scanf("%s",s2+1);
memset(c,0,sizeof(c));
int n,m,i,j,k;
n=strlen(s1+1);
m=strlen(s2+1);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(s1[i]==s2[j])
{
c[i][j]=c[i-1][j-1]+1;
}
else
{
if (c[i-1][j]>c[i][j-1])
c[i][j]=c[i-1][j];
else
c[i][j]=c[i][j-1];
}
}
}
printf("%d\n",c[n][m]);
}
return 0;
}