题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1159
#include <algorithm>
#include<cstdio>
#include<string>
#include<iostream>
#define MAXN 1000
using namespace std;
int dp[MAXN][MAXN];
string x,y;
int main()
{
while(cin>>x>>y){
int ans=0;
int k;
for(k=0;k<y.size();k++){
if(x[0]==y[k])break;
dp[0][k]=0;
}
for(;k<y.size();k++){
dp[0][k]=1;
}
for(k=0;k<x.size();k++)
{
if(x[k]==y[0])break;
dp[k][0]=0;
}
for(;k<x.size();k++)
{
dp[k][0]=1;
}
for(int i=1;i<x.size();i++)
{
for(int j=1;j<y.size();j++)
{
if(x[i]==y[j])dp[i][j]=dp[i-1][j-1]+1;
else if(x[i]!=y[j])
{
if(dp[i-1][j]>dp[i][j-1])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=dp[i][j-1];
}
if(dp[i][j]>ans)
ans=dp[i][j];
}
}
printf("%d\n",ans);
}
return 0;
}
LCS裸题……加动规思想
对于xi=yj时,dp[i][j]=dp[i-1][j-1]+1;
是为了防止出现重复计数,比如第一串是a,第二串是baaaa这种情况