题目
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.
思路
本题一开始会直接采用递归的方法,但是time limit了,如果对动规熟悉的话,会发现本题就是个典型的动态规划呀。我们维护一个二维数组A[m][n],其中A[i][j]指robot到该位置有A[i][j]可能的路径;那么状态转移方程就是A[i][j] = A[i-1][j] + A[i][j-1]。代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {//dp:res[i][j] = res[i-1][j] + res[i][j-1];
vector<vector<int>> res(m,vector<int>(n,1));
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
{
res[i][j] = res[i-1][j] + res[i][j-1];
}
return res[m-1][n-1];
}
};
基于上述思路,我们可以进一步优化,只是又花了空间复杂度,就是用一个一维数组来维护A[j]:
状态转移方程为A[j] += A[j-1]。代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {//dp:res[j] +=res[j-1];
vector<int> res(n,1);
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
{
res[j] += res[j-1];
}
return res[n-1];
}
};
version3
class Solution {
public:
int uniquePaths(int m, int n) {//dp:res[j] +=res[j-1];
vector<int> res(n,0);
res[0] = 1;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(j>0)
res[j] += res[j-1];
}
return res[n-1];
}
};