您的位置:首页 > 其它

LeetCode刷题——动态规划,No.62不同路径

2019-06-02 22:42 134 查看

题目是这样的:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

 

例如,上图是一个7 x 3 的网格。有多少可能的路径?

说明:m 和 n 的值均不超过 100。

示例 1:

[code]输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例 2:

[code]输入: 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列中,每一步只能来源于上方,所以只能是上方的路径数。

递推公式:

填充方式:直接按照横向或者纵向填都行

代码:

[code]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]
;

}
};

这里要注意一下:如果m、n都为1的话,也就是说自己到自己也是要算做一条路的,所以在初始化时,dp[1][1]=1; 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: