给定两个字符串s_1s_2...s_ns1s2...sn和t_1t_2...t_nt1t2...tn.求出这两个字符串的最长公共子序列的长度。
输入
- 输入第一行有两个整数mm和nn,分别表示字符串ss和tt的长度,输入第二行和第三行分别表示字符串s和t.
- 1 \leq n, m \leq 10001≤n,m≤1000.
输出
- 对于每行输入,输出一行,包含一个整数,表示这两个字符串的最长公共子序列的长度.
样例 1
输入
4 4 abcd becd
输出
3
#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[1001],t[1001];
int dp[1001][1001];
int main()
{
while(cin>>n>>m)
{
for(int i = 1;i <= n;i++)
cin >> s[i];
for(int i = 1;i <= m;i++)
cin >> t[i];
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
{
if(s[i] == t[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[n][m] << endl;
}
}
本文解析了如何使用动态规划解决给定两个字符串的最长公共子序列问题,通过实例展示了计算方法和C++代码实现。关键在于理解递推公式和状态转移过程。
1442

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



