数据结构与算法之动态规划:二维DP

一、不同路径leetcode62

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

1 # dp[i][j] = dp[i-1][j] + dp[i][j-1]
2 # 时:O(mn) 空:O(mn)
3 def findPath(m, n):
4     dp = [[1 for x in range(n)] for x in range(m)]
5     for i in range(1, m):
6         for j in range(1, n):
7             dp[i][j] = dp[i][j-1] + dp[i-1][j]
8     return dp[-1][-1]
1 def findPath(m, n):
2     dp = [1 for x in range(n)]
3     for i in range(1, m):
4         for j in range(1, n):
5             dp[j] = dp[j] + dp[j-1]
6     return dp[-1]

二、不同路径Ⅱleetcode63

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

 1 def findPath(obstacleGrid):
 2     m, n = len(obstacleGrid), len(obstacleGrid[0])
 3     dp = [[1 for _ in range(n)] for _ in range(m)]
 4     for i in range(m):
 5         for j in range(n):
 6             if obstacleGrid[i][j] == 1:
 7                 dp[i][j] = 0
 8             elif j > 0:
 9                 dp[i][j] = dp[i-1][j] + dp[i][j-1]
10     return dp[-1][-1]
 1 def findPath(obstacleGrid):
 2     m, n = len(obstacleGrid), len(obstacleGrid[0])
 3     dp = [1] + [0] * (n-1)
 4     for i in range(m):
 5         for j in range(n):
 6             if obstacleGrid[i][j] == 1:
 7                 dp[j] = 0
 8             elif j > 0:
 9                 dp[j] = dp[j] + dp[j-1]
10     return dp[-1]

 三、在棋盘上移动

给定一个nxn的棋盘,每个格子上有不同的值代表该格子的价值。目标是找到获利最大的移动路线,从第一行的某个格子到最后一行的某个格子

移动方法:移动到下一行的之前一列;移动到下一行;移动到下一行的下一列。

如何把一个大问题拆成小问题?要解决这些问题,要通过lookup的方式。

dp(i, j) = max(dp(i-1, j), dp(i-1, j-1), dp(i-1, j+1))

1 def movingBoard(board):
2     result = board
3     m, n = len(board), len(board[0])
4     for i in range(1, m):
5         for j in range(0, n):
6             result[i][j] = max(0 if j == 0 else result[i-1][j-1],
7             result[i-1][j], 
8             0 if j == n-1 else result[i-1][j+1]) + board[i][j]
9     return max(result[-1])
1 def movingBoard(board):#?
2     res = board[0]
3     m, n = len(board), len(board[0])
4     for i in range(1, m):
5         for j in range(0, n):
6             res[j] = max(0 if j == 0 else res[j-1],
7             res[j], 0 if j == n-1 else res[j+1]) + board[j]
8     return max(res)

四、最大正方形

给定一个二维01矩阵,从中找出最大的全1正方形矩阵并返回其面积

 1 def maximalSquare(matrix):
 2     if matrix == []:
 3         return 0
 4     m, n = len(matrix), len(matrix[0])
 5     dp = [[0] * n for x in range(m)]
 6     ans = 0
 7     for x in range(m):
 8         for y in range(n):
 9             dp[x][y] = int(matrix[x][y])
10             if x and y and dp[x][y]:
11                 dp[x][y] = min(dp[x-1][y-1], dp[x][y-1], dp[x-1]    
12                 [y]) + 1
13             ans = max(ans, dp[x][y])
14     return ans * ans

 降维?****************

posted @ 2020-03-17 17:16  LinBupt  阅读(147)  评论(0)    收藏  举报