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?
给定一个二维数组,从左上角到右下角每次只能向右或向下走一步,不能走回头路,计算所有可能的路径总数。
这道题是一道典型的动态规划题,其递推公式为:dp[i][j] = dp[i-1][j] + dp[i][j-1]。因此,我们可以很容易地写出如下程序:
int uniquePaths(int m, int n) {
if(m <= 0 || n <= 0)
return 0;
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];
}
上述代码使用一个m*n的二维数组来记录到达每个位置的路径,时间效率O(m*n),空间效率O(m*n),还有一种空间效率更高的方法,使用一个大小为n的数组,其保存的是到达该行该列位置的路径,代码如下:
int uniquePaths(int m, int n) {
if(m <= 0 || n <= 0)
return 0;
vector<int> dp(n, 1);
for(int i = 1; i < m; i++)
{
for(int j = 1; j < n; j++)
{
dp[j] += dp[j - 1];
}
}
return dp[n - 1];
}