刚好对应算法导论 15.4 最长公共子序列
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
string strA,strB;
#define MAX_N (2000+1)
unsigned short dp[MAX_N][MAX_N];
int lcs(string stra,string strb)
{
int la=stra.length();
int lb=strb.length();
dp[0][0]=0;
for(int i=0;i<la;i++)
dp[i][0]=0;
for(int j=0;j<lb;j++)
dp[0][j]=0;
for(int i=0;i<la;i++)
{
for(int j=0;j<lb;j++)
{
int rel_i = i+1;
int rel_j = j+1;
if(stra[i] == strb[j])
{
dp[rel_i][rel_j] = dp[rel_i-1][rel_j-1] + 1;
}
else
{
dp[rel_i][rel_j] = max(dp[rel_i-1][rel_j],dp[rel_i][rel_j-1]);
}
}
}
return dp[la+1-1][lb+1-1];
}
int main()
{
while(cin>>strA>>strB)
{
//cout<<"strA:"<<strA<<"strB:"<<strB<<endl;
cout<<lcs(strA,strB)<<endl;
}
}