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
- 上传者