每天堅持刷題!!!
因爲本人動態規劃實在是弱雞,激勵自己攻克難關
首先來一些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]
明天繼續死磕動態規劃