每天坚持刷题!!!
因为本人动态规划实在是弱鸡,激励自己攻克难关
首先来一些leetcode上动态规划的中等和简单的题来练练手, 个人对动态规划的理解就是可以把很多中间量储存在一个状态表里。
leetcode 62 不同路径
题目描述:
一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,问总共有多少条不同的路径?
题目分析:
1. 首先要吐槽下leetcode中m*n的矩阵竟然是n行m列,简直反人类,但是这道题倒是无所谓结果都一样。
2. 因为机器人只能往下或是往右走,那么任何一个格子只能从这个格子的上方和左方到达,即任何一个格子的全部走法数量为上方格子(如果有)的走法数量加上左方格子(如果有)的走法数量之和。
3. 具体而言,先初始化一个m*n的二维矩阵(Python就是list of list),为了方便起见,先计算第一行和第一列的数值,这个没啥好说的,都是1,那么就从(1,1)开始先行在列的遍历整个矩阵,输出矩阵的右下角元素即可
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
if not m or not n:
return 0
if m == 1 or n == 1:
return 1
temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
for i in xrange(n):
temp[0][i] = 1
for i in xrange(m):
temp[i][0] = 1
for i in xrange(1, m):
for j in xrange(1, n):
temp[i][j] = temp[i-1][j] + temp[i][j-1]
return temp[-1][-1]
leetcode 63 不同路径 II
这道题跟上一道几乎一样就放一起做了
题目描述:
一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
题目分析:
1. 这个跟上一道62几乎一样,唯一的不同是现在格子上有障碍物,那么需要把有障碍物的位置的走法数量设置为0即可,初始化第一列和第一行的时候也是一样,最后吐槽下自己因为是中午休息时写的代码质量烂。
2. 还有这个题目设置的丧心病狂一点是起始点也可能有障碍物….
class Solution(object):
def uniquePathsWithObstacles(self, obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
if not obstacleGrid:
return 0
m = len(obstacleGrid)
n = len(obstacleGrid[0])
temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
temp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0
for i in xrange(1, n):
temp[0][i] = 1 if temp[0][i-1] and obstacleGrid[0][i] == 0 else 0
for i in xrange(1, m):
temp[i][0] = 1 if temp[i-1][0] and obstacleGrid[i][0] == 0 else 0
for i in xrange(1, m):
for j in xrange(1, n):
if obstacleGrid[i][j] == 1:
temp[i][j] = 0
else:
temp[i][j] = temp[i-1][j] + temp[i][j-1]
return temp[-1][-1]
leetcode 64 最小路径和
PS:本来做完63想中午趴一会,一看64还是路径就继续做了…
题目描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。每次只能向下或者向右移动一步。
题目分析:
1. 我已经不想在看到路径的题目了…
2. 这道题跟62没啥区别,就是把加法变成min函数,即每一个格子的走法数量为上方格子(如果有)的走法数量和左方格子(如果有)的走法数量的最小值
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
if not grid:
return 0
m = len(grid)
n = len(grid[0])
temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
temp[0][0] = grid[0][0]
for i in xrange(1, n):
temp[0][i] = temp[0][i-1] + grid[0][i]
for i in xrange(1, m):
temp[i][0] = temp[i-1][0] + grid[i][0]
for i in xrange(1, m):
for j in xrange(1, n):
temp[i][j] = min(temp[i-1][j], temp[i][j-1]) + grid[i][j]
return temp[-1][-1]
明天继续死磕动态规划