动态规划——礼物的最大价值python
时间: 2023-10-21 19:04:34 浏览: 37
题目描述
在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定的价值(大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释:
路径 1→3→5→2→1 可以拿到最多价值礼物
提示:
0 < grid.length <= 200
0 < grid[0].length <= 200
解题思路
这道题可以用动态规划解决。我们可以定义一个 dp 数组,其中 dp[i][j] 表示到达 i,j 位置时能拿到的最大价值。那么我们可以得到状态转移方程:
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j]
其中 dp[i-1][j] 表示从上面的格子到达当前格子,dp[i][j-1] 表示从左边的格子到达当前格子,grid[i][j] 表示当前格子的价值。
最后返回 dp[m-1][n-1] 即可。
代码实现
Python 代码
相关问题
动态规划——礼物的最大价值问题用python写出来
好的,下面是礼物的最大价值问题的Python代码:
```python
def max_value(gift):
if not gift:
return 0
rows, cols = len(gift), len(gift[0])
dp = [[0] * cols for _ in range(rows)]
dp[0][0] = gift[0][0]
for i in range(1, rows):
dp[i][0] = dp[i - 1][0] + gift[i][0]
for j in range(1, cols):
dp[0][j] = dp[0][j - 1] + gift[0][j]
for i in range(1, rows):
for j in range(1, cols):
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + gift[i][j]
return dp[rows - 1][cols - 1]
```
其中`gift`是一个二维数组,表示每个格子中的礼物价值。函数`max_value`返回礼物的最大价值。首先,我们初始化一个`dp`二维数组,用于存储到达每个格子的最大价值。然后,我们分别计算第一行和第一列的最大价值,因为它们只能从上方或左方到达。最后,我们通过递推计算每个格子的最大价值,最终得到右下角的最大价值。
动态规划——礼物的最大价值问题用python写出来及输入
礼物的最大价值问题是一个经典的动态规划问题。假设有一个m行n列的矩阵,每个格子里放着一个礼物,每个礼物的价值不同。你可以从矩阵的左上角出发,每次只能向下或者向右移动一格,直到到达矩阵的右下角。请计算出你最多能拿到多少价值的礼物。下面是使用Python实现的代码:
```python
def max_value(matrix):
if not matrix:
return 0
rows, cols = len(matrix), len(matrix[0])
dp = [[0] * (cols + 1) for _ in range(rows + 1)]
for i in range(1, rows + 1):
for j in range(1, cols + 1):
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + matrix[i - 1][j - 1]
return dp[rows][cols]
# 测试
matrix = [[1, 10, 3, 8],
[12, 2, 9, 6],
[5, 7, 4, 11],
[3, 7, 16, 5]]
print(max_value(matrix))
```
输入的格式是一个二维列表,每个元素代表矩阵中对应位置的礼物价值。例如,上面的测试输入对应的矩阵为:
```
1 10 3 8
12 2 9 6
5 7 4 11
3 7 16 5
```
你可以根据需要修改输入格式,比如将每行数字用空格隔开,或者使用逗号分隔等。