算法学习之动态规划(leetcode 62. Unique Paths)
2017-03-17 15:11
459 查看
0x01题目
62. Unique Paths A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below). How many possible unique paths are there?
Above is a 3 x 7 grid. How many possible unique paths are there? Note: m and n will be at most 100.
0x02解析
超级基本的动态规划题目。从图来看,直接应用动态规划思路。定义概念:
dp[i][j]定义为从
(0, 0)到
(i, j)的所有不同的路径数量。
边界初始化:由于只能往右和往下,显然
dp[0][j]=1,
dp[i][0]=1。
一般情况递推:假设到达
(i-1, j),
(i, j-1)处的所有不同路径数均已知,即
dp[i-1][j]和
dp[i][j-1]已知,则显然
dp[i][j] = dp[i][j-1] + dp[i-1][j],因为到达
dp[i][j]只能通过
dp[i-1][j]和
dp[i][j-1]。如图所示。
0x03代码
根据以上思想可以写出如下代码,其空间复杂度为O(m*n),时间复杂度为O(m*n)public class Solution { public int uniquePaths(int m, int n) { if(m <= 0 || n <= 0) return 0; int[][] dp = new int[m] ; for(int i = 0; i < m; i++){ dp[i][0] = 1; } for(int j = 0; j < n; j++){ dp[0][j] = 1; } for(int i = 1; i < m; i++){ for(int j = 1; j < n; j++){ dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } return dp[m-1][n-1]; } }
观察到上述算法在进行实际运行的时候,其实是一行一行“扫”下来的,或者说是一列一列“扫”下来的,因此,没有必要保留整个矩阵,只需要保留两行或者两列,下面代码是保留两列。cur含义是当前列,pre含义是上一列。其空间复杂度为O(2*m)(保留两行此值为O(2*n)),时间复杂度为O(m*n)
public class Solution { public int uniquePaths(int m, int n) { if(m <= 0 || n <= 0) return 0; int[] pre = new int[m]; int[] cur = new int[m]; for(int i = 0; i < m; i++){ pre[i] = 1; cur[i] = 1; } for(int j = 1; j < n; j++){ for(int i = 1; i < m; i++){ cur[i] = cur[i-1] + pre[i]; } //update for(int i = 1; i < m; i++){ pre[i] = cur[i]; } } return pre[m-1]; } }
更进一步,只需要保留一行,其代码如下
public class Solution { public int uniquePaths(int m, int n) { if(m <= 0 || n <= 0) return 0; int[] cur = new int ; for(int j = 0; j < n; j++){ cur[j] = 1; } for(int i = 1; i < m; i++){ for(int j = 1; j < n; j++){ cur[j] += cur[j-1]; } } return cur[n-1]; } }
参考
https://discuss.leetcode.com/topic/15265/0ms-5-lines-dp-solution-in-c-with-explanations
相关文章推荐
- 算法学习之动态规划(leetcode 72. Edit Distance)
- 算法学习之动态规划(leetcode 91 Decode Ways)
- 算法学习之动态规划(leetcode 174. Dungeon Game)
- 算法学习之动态规划(leetcode 87. Scramble String)
- 算法学习之动态规划(leetcode 304. Range Sum Query 2D - Immutable)
- 算法学习之动态规划(leetcode 85. Maximal Rectangle)
- 算法学习之动态规划(leetcode 44 Wildcard Matching)
- [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )
- 【算法学习笔记】43.动态规划 逆向思维 SJTU OJ 1012 增长率问题
- 【算法学习笔记】80.二维动态规划 SJTU OJ 3022 二哥要翘课
- 经典算法学习之动态规划
- Leetcode算法学习日志-576 Out of Boundary Paths
- [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )
- 【算法学习笔记】之动态规划
- 【算法学习笔记】23.动态规划 解题报告 SJTU OJ 1280 整装待发
- 动态规划-算法学习之路
- 算法学习之动态规划--最长上升子序列
- 【算法学习笔记】27.动态规划 解题报告 SJTU OJ 1254 传手绢
- 动态规划(算法导论学习笔记)
- 【算法之动态规划(五)】DP规划思想学习:从《算法导论》到《算法设计》