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?
题目的意思就是给你一个m*n网格,求从左上角到右下角的路径条数即可,用dp很容易解决,推到式为res[i][j] = res[i - 1][j] + res[i][j - 1]。意思就是到一个特定点的路径条数是到其左侧或者上侧点的路径条数的总和。
代码如下:
1 class Solution { 2 public: 3 int uniquePaths(int m, int n) { 4 vector<vector<int> > ans(m, vector<int>(n, 0)); 5 for(int i = 0; i < m; ++i) 6 ans[i][0] = 1; 7 for(int j = 0; j < n; ++j) 8 ans[0][j] = 1; 9 10 for(int i = 1; i < m; ++i){ 11 for(int j = 1; j < n; ++j){ 12 ans[i][j] = ans[i - 1][j] + ans[i][j - 1]; 13 } 14 } 15 return ans[m - 1][n - 1]; 16 } 17 };
还有一种方法是使用dfs来实现,但是数大了就容易超时,这题的本意可能就是dfs,这里把代码放上:
1 class Solution { 2 public: 3 int uniquePaths(int m, int n) { 4 times = 0; 5 maxHor = m, maxVer = n; 6 dfs(0,0); 7 return times; 8 } 9 void dfs(int hor, int ver){ 10 if((hor == maxHor - 1) && (ver = maxVer - 1)) 11 times++; 12 else{ 13 if(hor + 1 < maxHor) //注意这里不是while 14 dfs(hor + 1, ver); 15 if(ver + 1 < maxVer) 16 dfs(hor, ver + 1); 17 } 18 } 19 private: 20 int times; 21 int maxHor; 22 int maxVer; 23 };
java版本如下所示,dp实现:
1 public class Solution { 2 public int uniquePaths(int m, int n) { 3 if(m == 0 || n == 0) 4 return 0; 5 int [][] grid = new int [m][n]; 6 for(int i = 0; i < m; ++i){ 7 grid[i][0] = 1; 8 } 9 for(int i = 0; i < n; ++i){ 10 grid[0][i] = 1; 11 } 12 for(int i = 1; i < m; ++i){ 13 for(int j = 1; j < n; ++j){ 14 grid[i][j] = grid[i-1][j] + grid[i][j-1]; 15 } 16 } 17 return grid[m-1][n-1]; 18 } 19 }