多维动态规划(Multidimensional Dynamic Programming,简称MDP)是动态规划的一种扩展形式,它用于解决具有多个决策变量的优化问题。在传统的动态规划中,问题通常被描述为单变量或双变量问题,而多维动态规划则可以处理多个决策变量

摘要:多维动态规划 (1) 不同路径 """ 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一
多维动态规划 (1) 不同路径 """ 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径? """ dp = [[1] * n for _ in range(m)] for i in range(1, m): for j in range(1, n): dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[m-1][n-1] (2) 最小路径和 """ 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 """ m = len(grid) n = len(grid[0]) dp = grid.copy() for i in range(1, m): dp[i][0] = dp[i-1][0]+grid[i][0] for j in range(1, n): dp[0][j] = dp[0][j-1]+grid[0][j] for i in range(1, m): for j in range(1, n): dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j] return dp[m-1][n-1] (3) 最长回文子串 """ 给你一个字符串 s,找到 s 中最长的回文子串。 """ n = len(s) res_left = res_right = 0 # 奇回文串 for i in range(n): l = r = i while l >= 0 and r < n and s[l] == s[r]: l -= 1 r += 1 if r-l-1 > res_right-res_left: res_left, res_right = l+1, r # 偶回文串 for i in range(n-1): l, r = i, i+1 while l >= 0 and r < n and s[l] == s[r]: l -= 1 r += 1 if r-l-1 > res_right-res_left: res_left, res_right = l+1, r return s[res_left:res_right] (4) 最长公共子序列 """ 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 """ m = len(text1) n = len(text2) dp = [[0]*(n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if text1[i-1] == text2[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] (5) 编辑距离 """ 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。
阅读全文