本题意思就是给你两个子串,让求出这两个串中最长的公共子序列。abcfbc abfcab → abfb/abfc/abcb
本题目其实就是简单的最长公共子序列,解法如下
Dp[] |
| a | b | c | f | b | c |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
a | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
b | 0 | 1 | 2 | 2 | 2 | 2 | 2 |
f | 0 | 1 | 2 | 2 | 3 | 3 | 3 |
c | 0 | 1 | 2 | 3 | 3 | 3 | 4 |
a | 0 | 1 | 2 | 3 | 3 | 3 | 4 |
b | 0 | 1 | 2 | 3 | 3 | 4 | 4 |
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define M 1000
char a[M],b[M];
int dp[M][M];
int main()
{
int n,m,p,q;
while(scanf("%s %s",a,b)!=EOF)
{
memset(dp,0,sizeof(dp));
p=strlen(a);
q=strlen(b);
for(n=1;n<=p;n++)
{
for(m=1;m<=q;m++)
{
if(a[n-1]==b[m-1])
dp[n][m]=dp[n-1][m-1]+1;
else
dp[n][m]=max(dp[n-1][m],dp[n][m-1]);
}
}
printf("%d\n",dp[p][q]);
}
return 0;
}
//最长公共子序列