动态规划题目及简要分析
摘要
在算法分析和实现中,动态规划是一种常见且重要的思想。掌握了该思想,会显著提高你的编程能力,几乎可以解决遇到的绝大多数问题。动态规划非常适合解决最大最小值、最多最少和最优等最值
问题。动态规划常常与分治法放在一起比较,它们有许多共同点,放在一起比较可以更好地理解和掌握这两种方法。因此本文的主要内容有以下几点:
- 动态规划思想简介
- 动态规划与分治的对比
- 动态规划编程题
动态规划思想简介
动态规划与分治的对比
动态规划编程题
- 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。1
说明
:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
实现:
class Solution:
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
n, m = len(grid), len(grid[0])
for i in range(n):
for j in range(m):
x = y = 0
if i - 1 >= 0 > j - 1:
x = y = grid[i - 1][j]
if j - 1 >= 0 > i - 1:
x = y = grid[i][j - 1]
if j - 1 >= 0 and i - 1 >= 0:
x = grid[i - 1][j]
y = grid[i][j - 1]
grid[i][j] = min(x + grid[i][j], y + grid[i][j])
return grid[-1][-1]
题目一分析:遍历grid,根据题目要求刷新其各元素的值。具体的,grid[0][0]元素保持不变,其余元素的刷新值为当前元素加上其左边和上边相邻元素的最小值
(如果左边或者上边没有元素,则只加上存在元素值)。