LeetCode:剑指 Offer II 098. 路径的数目

每日一题,简单dp!+dp简单解析

题目链接:剑指 Offer II 098. 路径的数目 - 力扣(LeetCode)

题目信息:

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

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

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

题目解析:

没有解析

解题方法:简单dp(自底向上)

代码及超详细解析:

class Solution {
    public int uniquePaths(int m, int n) {
        int[][]dp=new int[m][n];//创建一张地图,存储走到每块区域的步数
        for(int i=0;i<n;i++)dp[0][i]=1;//第一行只有一种方式到达
        for(int j=0;j<m;j++)dp[j][0]=1;//第一列只有一种方式到达
        for(int x=1;x<n;x++)//遍历每一列
        {
            for(int y=1;y<m;y++)//遍历每一行
            {
                dp[y][x]=dp[y-1][x]+dp[y][x-1];//当前区域步数等于上方一块+左方一块步数之和
            }
        }
        return dp[m-1][n-1];//返回(m,n)块区域的步数
    }
}

动态规划:

动态规划常用来解决最优化问题,这类问题常常有很多可行解,且最优解通常也不止一个

适用动态规划求解最优化问题应该具备:最优子结构+子问题重叠

最优子结构:(贪心同样适用,此处不说明贪心与dp的区别)

一个问题的最优解包含其子问题的最优解

子问题重叠:

即问题的递归算法会反复求解相同的子问题,而不是一直生成新的子问题;

例如本题中:若采用自顶向下(递归)求解:要求(2,2)位置的步数,需要求

(2,1)(1,2)

(1,1)(2,0)(0,2)(1,1)

(0,1)、(1,0)(1,0)(0,1)(0,1)、(0,1)

(0,0)、(0,0)、(0,0)、(0,0)、(0,0)、(0,0)

可以看出,求解(1,1)时把(0,1)、(1,0)、(0,0)求解一次,(2,2)时再求解一次。

一般采用自底向上的方式求解,若要采用自顶向下方法,则需要带备忘的形式把求解过的子问题的解存储下来【带备忘的自顶向下法】,不然将会计算大量重复问题。

涉及动态规划算法4步骤:

  1. 刻画最优解结构特征

  1. 递归地定义最优解的值

  1. 计算最优解的值,通常采用自底向上的方法

  1. 利用计算出的值构造最优解

1~3是动态规划求解问题的基础,若只需一个最优解值,可忽略第4步

动态规划是一个难点,我也才开始接触,可以选择从简单的题中慢慢体会动态规划的思想,一步一个脚印,加油!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值