poj-1458作为样例。题目链接如下
https://vjudge.net/problem/POJ-1458
//写在前面
//最长公共子序列:即给定两个字符序列要你找到两者中最长的公共子序列
//状态转移方程为:{0 i=0或j=0;
// dp[i][j]={dp[i-1][j-1]+1 a[i]=b[j];
// {max(dp[i-1][j],dp[i][j-1] a[i]!=b[j];
//其中dp[i][j]代表a序列的前i个字符与b序列的前j个字符的最长公共子序列的长度
//下面我们以poj-1458作为样例
#include <iostream>
#include <string>
#include <string.h>
#define maxn 1005
using namespace std;
int dp[maxn][maxn];
int main()
{
string a,b;
while(cin>>a>>b)
{
a=' '+a;b=' '+b;//扩充字符串,以处理边界
memset(dp,0,sizeof(dp));
int len1=a.length()-1;int len2=b.length()-1;
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
//状态转移方程
if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[len1][len2]<<'\n';
//路径打印,如果需要的话可以去掉33,48行的注释
/* int u=len1;int v=len2;
while(u>=1&&v>=1)
{
if(a[u]==b[v])
{
cout<<a[u];
u--;
v--;
}
else
{
if(dp[u-1][v]>=dp[u][v-1])u--;
//如果要打印其他的最长序列可以将等于号移到47行的if语句中
else if(dp[u-1][v]<dp[u][v-1])v--;
}
}
cout<<'\n';*/
}
}
/*
abcfbc abfcab
programming contest
abcd mnp
*/