首页 科普 正文

编程动态规划

科普 编辑:瑾煜 日期:2024-04-29 23:01:21 104人浏览

动态规划(Dynamic Programming)是解决最长公共子序列(Longest Common Subsequence,LCS)问题的经典方法之一。LCS 是指在两个序列中找到的最长的公共子序列的长度,不要求子序列在原序列中是连续的。动态规划方法可以有效地解决这一问题,下面是一个使用动态规划计算 LCS 的示例 Python 代码:

```python

def lcs_dp(X, Y):

m = len(X)

n = len(Y)

编程动态规划

创建一个二维数组用于保存子问题的解

dp = [[0] * (n 1) for _ in range(m 1)]

填充 dp 数组

for i in range(1, m 1):

for j in range(1, n 1):

if X[i 1] == Y[j 1]:

dp[i][j] = dp[i 1][j 1] 1

else:

dp[i][j] = max(dp[i 1][j], dp[i][j 1])

构造最长公共子序列

lcs_length = dp[m][n]

lcs = [''] * lcs_length

i, j = m, n

while i > 0 and j > 0:

if X[i 1] == Y[j 1]:

lcs[lcs_length 1] = X[i 1]

i = 1

j = 1

lcs_length = 1

elif dp[i 1][j] >= dp[i][j 1]:

i = 1

else:

j = 1

return ''.join(lcs)

示例用法

X = "ABCBDAB"

Y = "BDCAB"

result = lcs_dp(X, Y)

print("最长公共子序列为:", result)

```

这段代码中,`lcs_dp` 函数使用一个二维数组 `dp` 来保存子问题的解。`dp[i][j]` 表示 `X[0:i]` 和 `Y[0:j]` 的最长公共子序列的长度。算法首先填充 `dp` 数组,然后根据 `dp` 数组的内容反向构造出最长公共子序列。

分享到

文章已关闭评论!