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

题目是这样的:

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

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

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

 

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

说明:m 和 的值均不超过 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列中,每一步只能来源于上方,所以只能是上方的路径数。

递推公式:

\LARGE \LARGE \LARGE dp[i][j] = \begin{Bmatrix} 1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i=1,j=1 \\ dp[i][j-1]+dp[i-1][j]] \ \ \ \ \ \ \ \ \ i>1,j>1 \\ dp[i-1][j] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ j=1,i>1 \\ dp[i][j-1]] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ i=1,j>1 \end{Bmatrix}

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

代码:

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; 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值