C++最长公共子序列(动态规划法 代码
时间: 2023-12-17 12:26:14 浏览: 98
C++最长公共子序列问题可以使用动态规划法来解决。具体的算法思想是,先将两个字符串分别存储到两个数组中,然后定义一个二维数组dp,用来存储最长公共子序列的长度。接着,使用两个for循环遍历两个字符串,如果当前字符相同,则将dp[i][j]的值设置为dp[i-1][j-1]+1,否则将dp[i][j]的值设置为max(dp[i-1][j],dp[i][j-1])。最后,回溯dp数组,找到最长公共子序列。
下面是C++代码实现:
```
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 1005;
int dp[MAXN][MAXN];
char s1[MAXN], s2[MAXN];
int main()
{
cin >> s1 >> s2;
int len1 = strlen(s1), len2 = strlen(s2);
for(int i=1; i<=len1; i++)
{
for(int j=1; j<=len2; j++)
{
if(s1[i-1] == s2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
int len = dp[len1][len2]; char ans[MAXN];
int k = 0;
for(int i=len1, j=len2; i>0 && j>0; )
{
if(s1[i-1] == s2[j-1])
{
ans[k++] = s1[i-1];
i--;
j--;
}
else if(dp[i-1][j] > dp[i][j-1])
i--;
else
j--;
}
for(int i=k-1; i>=0; i--)
cout << ans[i];
cout << endl;
return 0;
}
```
阅读全文