0
点赞
收藏
分享

微信扫一扫

最长公共子序列(线性DP)


文章目录

  • ​​Question​​
  • ​​Ideas​​
  • ​​Code​​

Question

给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

输入格式
第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。

输出格式
输出一个整数,表示最大长度。

数据范围
1≤N,M≤1000
输入样例:
4 5
acbd
abedc
输出样例:
3

Ideas

线性DP

Code

a,b = list(map(int,input().strip().split()))
s1 = '0' + input().strip()
s2 = '0' + input().strip()

N = 1010
M = 1010
f = [[0 for i in range(N)] for i in range(N)] # f[i,j]代表在s1前i个位置中出现且在s2前j个位置中出现的所有子序列长度的最大值

# 关于初始化 因为当i为0或者j的时候,所有的子序列长度均为0 ,定义的时候默认如此,无需初始化
for i in range(1,a+1):
for j in range(1,b+1):
f[i][j] = max(f[i-1][j],f[i-1][j-1],f[i][j-1])
if s1[i] == s2[j]:
f[i][j] = max(f[i][j],f[i-1][j-1]+1)

print(f[a][b])


举报

相关推荐

0 条评论