Python 中自底向上的动态规划算法

2023-04-17 00:00:00 算法 规划 向上

自底向上的动态规划算法是一种递推的算法,它从最简单的问题开始逐步求解更复杂的问题。在实现上,我们需要定义状态和状态转移方程。

例如,我们可以考虑一个经典的动态规划问题——最长公共子序列(LCS)。给定两个字符串S1和S2,求它们的最长公共子序列的长度。

定义状态:我们用dp[i][j]表示S1[0:i]和S2[0:j]的最长公共子序列的长度。其中,i和j的取值范围为[0, len(S1)]和[0, len(S2)]。

状态转移方程:如果S1[i-1]等于S2[j-1],那么dp[i][j]就是dp[i-1][j-1]+1。如果S1[i-1]不等于S2[j-1],那么dp[i][j]就是dp[i-1][j]和dp[i][j-1]的较大值。

以下是Python代码演示:

def longestCommonSubsequence(s1: str, s2: str) -> int:
    m, n = len(s1), len(s2)
    dp = [[0] * (n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s1[i-1] == s2[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    return dp[m][n]

当我们要求解dp[m][n]时,所有的dp[i][j]都已经被计算出来了。最终的结果就是dp[m][n]。

在上述代码中,我们首先定义了dp数组,然后使用双重循环遍历所有的状态。最后返回dp[m][n]即可。

相关文章