本题意思就是给你两个子串,让求出这两个串中最长的公共子序列。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;
}
//最长公共子序列

本文详细介绍了如何求解两个字符串的最长公共子序列问题,通过动态规划的方法给出了具体的实现步骤,并提供了完整的C++代码示例。
4877

被折叠的 条评论
为什么被折叠?



