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?
第一印象可以用递归回溯的方法解决问题。但是提交的时候超时了。该方法不可求。
class Solution {
public:
bool helper(vector<vector<bool> > &flag,int row, int col,int maxrow, int maxcol)
{
if(row == maxrow-1&&maxcol-1 == col){
count ++;
return true;
}
if(row >= maxrow||col >= maxcol||flag[row][col]){
return false;
}
flag[row][col] = true;
helper(flag,row,col+1,maxrow,maxcol);
helper(flag,row+1,col,maxrow,maxcol);
flag[row][col] = false;
return true;
}
int uniquePaths(int m, int n) {
vector<vector<bool> > flag(m,vector<bool>(n,false));
count = 0;
helper(flag,0,0,m,n);
return count;
};
第二种方法就是利用动态规划,因为题目中要求只能向下和向右移动,所以可以利用两个数组,保存同一列和左边一列的数据就可以了。利用pre保存前一列的数据,cur保存当前列的数据。所以可以通过交换后,当前列变成后一列。
class Solution {
public:
int uniquePaths(int m, int n) {
if(m > n) return uniquePaths(n,m);
vector<int> cur(m,1);
for(int j = 1; j < n; j++)
{
for(int i = 1; i < m; i++)
{
cur[i] = cur[i-1] + pre[i];
}
swap(cur,pre);
}
return pre[m-1];
}
};
具体分析以后该题中的pre数组是多余的,因为可以利用cur[i]保存前一列的数据,这样在递归的过程中不会被覆盖。
class Solution {
public:
int uniquePaths(int m, int n) {
if(m > n) return uniquePaths(n,m);
vector<int> cur(m,1);
for(int j = 1; j < n; j++)
{
for(int i = 1; i < m; i++)
{
cur[i] += cur[i-1];// + pre[i];
}
}
return cur[m-1];
}
};
但是不可以用两个变量。