1 条题解
-
0
动态规划解法
使用动态规划(DP)来解决 LCS 问题,定义
dp[i][j]
表示字符串a
的前i
个字符和字符串b
的前j
个字符的 LCS 长度。状态转移方程
- 如果
a[i] == b[j]
:- 当前字符可以加入 LCS,所以
dp[i][j] = dp[i-1][j-1] + 1
。
- 当前字符可以加入 LCS,所以
- 如果
a[i] != b[j]
:- 当前字符不能同时加入 LCS,所以取
dp[i-1][j]
(不考虑a[i]
)和dp[i][j-1]
(不考虑b[j]
)的最大值:dp[i][j] = max(dp[i-1][j], dp[i][j-1])
。
- 当前字符不能同时加入 LCS,所以取
初始化
dp[0][j] = 0
(a
为空时,LCS 长度为 0)。dp[i][0] = 0
(b
为空时,LCS 长度为 0)。
最终答案
dp[n][m]
即为两个字符串的 LCS 长度。
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; const int N = 1000 + 5; char a[N],b[N]; int dp[N][N]; int main(){ while(scanf("%s%s",a+1,b+1) == 2) { int n = strlen(a+1); int m = strlen(b+1); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i][j-1], dp[i-1][j]); } } printf("%d\n",dp[n][m]); } }
- 如果
- 1
信息
- ID
- 459
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者