实现一个动态规划算法
def knapsack(weights, values, capacity):n = len(weights)dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]for i in range(1, n + 1):for w in range(capacity + 1):if weights[i - 1] <= w:dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])else:dp[i][w] = dp[i - 1][w]return dp[n][capacity]
实现一个动态规划算法,不同路径的,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角
def unique_paths(m, n):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]
实现一个动态规划算法,给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
def min_path_sum(grid):m, n = len(grid), len(grid[0])dp = [[0] * n for _ in range(m)]dp[0][0] = grid[0][0]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]
实现一个动态规划算法,删除并获得点数,给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
def delete_and_earn(nums):if not nums:return 0max_num = max(nums)points = [0] * (max_num + 1)for num in nums:points[num] += numdp = [0] * (max_num + 1)dp[1] = points[1]for i in range(2, max_num + 1):dp[i] = max(dp[i - 1], dp[i - 2] + points[i])return dp[max_num]
实现一个动态规划算法,计算三角形的最短路径和,从顶部到底部的最小路径和
def minimum_total(triangle):if not triangle:return 0n = len(triangle)dp = triangle[-1][:] for i in range(n - 2, -1, -1):for j in range(len(triangle[i])):dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])return dp[0]
