题目分析
题意
每行输入两个字符串,求这两个字符串的最长公共子序列。
思路
子序列:
举例:abdfieeow 中(按顺序)adf、abow等都是其子序列。
最长子序列是动态规划(DP)的典型例子。
LCS(x,y)即字符串x和y的最长公共子序列。
当i=0或是j=0时
dp[i][j]=0
当a[i-1]==b[j-1]时
dp[i][j]=dp[i-1][j-1]+1
当a[i-1]!=b[j-1]时
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define M 5000
int dp[M][M];//a中前M个字符串与b中前M个字符串的最长公共子序列的长度
char a[M],b[M];
int main(){
//freopen("data.txt","r",stdin);
int i,j,la,lb;
while(~scanf("%s%s",a,b)){
la=strlen(a);
lb=strlen(b);
for(i=0;i<la;i++)
dp[i][0]=0;
for(j=0;j<lb;j++)
dp[0][j]=0;
for(i=1;i<=la;i++){
for(j=1;j<=lb;j++){
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d\n",dp[la][lb]);
}
return 0;
}