题目是这样的:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3 输出: 28
看到这道题目我第一开始的想法是深度优先搜索,然后没搜到一条不重复的路就把总路径数加一,但是看到m,n均不超过100,算了下,大致为2^100次方,肯定会超时,所以只能考虑其他的算法。
其实具体看到“求出总的路径数”这种只需要输出最终结果的描述就能够想到,既然只需要输出路径数量,而不是每条路径,那么我可不可以推导一下规律,然后直接用规律来解题呢?(笑)于是,就分析分析到达第 i 行 第 j 列的位置上,一共有多少条路径可走。考虑到每次只能向右或者向下走一步,那么到达map[i][j] 位置的上一步无非是来自于上或者左,即:到达map[i][j] 时的路径总数为到达map[i-1][j] 的路径数与到达map[i][j-1]的路径数之和。而因为在第1行中,每一步都只能来源于左方,所以只能是左方的路径数,在第1列中,每一步只能来源于上方,所以只能是上方的路径数。
递推公式:
填充方式:直接按照横向或者纵向填都行
代码:
class Solution {
public:
int uniquePaths(int m, int n) {
int a[m+5][n+5]={0};
a[1][1] = 1;
for(int i=2;i<=m;i++)
{
a[i][1]=1;
}
for(int i=2;i<=n;i++)
{
a[1][i]=1;
}
for(int i=2;i<=m;i++)
{
for(int j=2;j<=n;j++)
{
a[i][j]=a[i-1][j]+a[i][j-1];
}
}
return a[m][n];
}
};
这里要注意一下:如果m、n都为1的话,也就是说自己到自己也是要算做一条路的,所以在初始化时,dp[1][1]=1;