题目
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 X n的网格左上方,只能向下或者向右移动,有多少可能的路径能够到达最底下的网格。假如使用路径搜索等递归算法,可能会超时。
我们可以在Excel中计算总路径数,就会发现其中的规律。下面列出(m,n)的结果矩阵:
| n\m |1 | 2| 3|4|5|6|
| :-------- | --------:| :------: |:-------- | :-------- | :-------- |
| 1 |1 | 1 | 1| 1| 1| 1|
| 2 |1 | 2| 3|4|5|6|
| 3 | 1| 3| 6|10|15|21|
| 4 | 1| 4| 10|20|35|56|
| 5 | 1| 5| 15|35|70|126|
| 6 | 1| 6| 21|56|126 | 258|
可以看到这样的规律(m,n)=(m-1,n)+(m,n-1),左边的数字加上上边的数字能够得到该数字,也就是动态规划的思想,要达到(m,n)的位置,只有两个路径(m,n-1)和(m-1,n),而这两个之前计算过了,就不用计算了。因此可以列一个100X100的表,通过循环把所有的数都算出来,然后输出结果即可。
其他人的方法:反正是向下和向右,不用管其顺序,可以看做数学的组合问题,随意组合,之后由于一直朝一个方向算一条独特的路径,因此再除去某数的阶层!。
int uniquePaths(int m, int n) {
int ans[101][101]={1};
for(int i=1;i<101;i++)
ans[1][i]=1;
ans[2][1]=1;
for(int i=2;i<101;i++)
{
ans[i][i]=2*ans[i-1][i];
for(int j=i+1;j<101;j++)
{
ans[i][j]=ans[i][j-1]+ans[i-1][j];
}
}
if(m>n)
return ans[n][m];
else
return ans[m][n];
}