Description
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 7 x 3 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
Example 1:
Input:
m = 3, n = 2
Output:
3
Explanation:
From the top-left corner, there are a total of 3 ways to reach
the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right
Example 2:
Input:
m = 7, n = 3
Output:
28
分析
题目的意思是:一个机器人从左上角走到右下角,有几种走法。
- 令dp[i][j]为从0,0位置到i,j位置的走法数,所以dp[i][j]=dp[i-1][j]+dp[i][j-1],即既可以从 左边的i-1,j位置走到i,j位置,也可以从i,j-1位置走到i,j位置。
C++
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m,vector<int>(n,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];
}
};
python
只要抓住向右走和向下走的递推公式dp[i][j]=dp[i-1][j]+dp[i][j-1]就行了,边界条件,即索引越界需要单独处理,然后最初始位置dp[0][0]初始化为1,表示有一条路径,想到这里就能做出来。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# dp[i][j]=dp[i-1][j]+dp[i][j-1]
# dp[0][0]=1
# i==0 dp[i][j]=dp[i][j-1]
# j==0 dp[i][j]=dp[i-1][j]
dp=[[0]*n for i in range(m)]
for i in range(m):
for j in range(n):
if i==0 and j==0:
dp[0][0]=1
elif i==0:
dp[i][j]=dp[i][j-1]
elif j==0:
dp[i][j]=dp[i-1][j]
else:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
return dp[m-1][n-1]