【算法】【动态规划】动规dp解决不同路径两道经典OJ笔试题【力扣62-力扣63】超详细的动态规划入门详解,掌握动态规划的解题方法

作者: @小小Programmer
这是我的主页:@小小Programmer
在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏Leetcode想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力。看完之后别忘记关注我哦!️️️

本篇建议收藏后食用~

动态规划五部曲

  • 确定dp数组的含义—也就是dp[i][j]或者dp[i]到底是指的是啥,自己心里要很清楚。
  • 确定递推公式
  • 初始化dp数组–如果我们要递推,一开始的dp值我们肯定要知道的啦
  • 确定遍历顺序
  • 举例推导dp数组

OJ.62 不同路径

题目描述

动态规划解法

我们一步一步按照方法来解决这道题目:
因为我们每走到一个地方,我们只有两种选择,向右或者向下
所以我们可以建立二位的dp数组,来存放每个点位的信息

  1. dp[i][j] 存的是从(0,0)出发,到(i,j)的不同路径总数
  2. dp[i][j]很明显->dp[i][j]=dp[i-1][j]+dp[i][j-1]
  3. 初始化:从(0,0)->(i,0)或从(0,0)->(0,i)都是只有一条
  4. 我们每个点位的dp[i][j]都依赖于前面或者上面的数组值,所以我们肯定是从前向后遍历
  5. 我们可以尝试自己推导一下,看看能不能推出题目给的例子的答案,如果没问题,我们就基本可以确定,我们的思路没问题了。

完整代码:

class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>>dp(m, vector<int>(n, 0));
for (int i = 0; i < m; i++)dp[i][0] = 1;
for (int i = 0; i < n; i++)dp[0][i] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {//注意注意,这两个要从1开始遍历,因为0已经初始化好了,再0-1会越界
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};

深度优先搜索dfs解法

当然,由于这题的特殊性,我们除了用动态规划来处理之外,我们还可以用深度优先搜索的思想,搜索路径。

  • 由于我们每到一个点,都只能向右或者向下走,所以,我们完全可以把这个路径看成二叉树的树枝,这个问题其实就变成一个简单的,二叉树找叶子节点的问题
//解法1:深度优先搜索->看成一棵二叉树
//因为只能向右或者向下走,所以可以看成二叉树
class Solution {
private:
int dfs(int i, int j, int m, int n) {
if (i > m || j > n)return 0;//越界了
if (i == m && j == n)return 1;//找到一条路
return dfs(i + 1, j, m, n) + dfs(i, j + 1, m, n);
}
public:
int uniquePaths(int m, int n) {
return dfs(1, 1, m, n);
}
};
//这样深度优先搜索,其实非常费时间,因为它的本质其实是递归

两种方法效率对比

我们先来看效率比较:
动态规划法:
dfs:
其实我们可以发现,dfs其实是跑不过OJ的,因为当行和列比较大的时候,递归这种方法其实效率是非常低的,而在这道题里面,动态规划其实是迭代的方法,所以效率更高!

OJ.63 不同路径ll

题目描述

动态规划解法

其实这一题和上一题的区别就是多了个障碍物而已,只要我们再初始化的时候,遇到障碍物,就跳出循环即可。

初始化步骤:

遍历的的时候:

  • 如果遍历到dp[i][j]的时候,发现(i,j)上有障碍物,说明这条路走不通了,直接跳过本次循环即可。

完整代码:

//OJ63 不同路径2
//这题与上一题的区别就是这题有障碍物
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>>dp(m, vector<int>(n, 0));
//初始化
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++)
//如果遇到障碍物,直接跳出循环
dp[i][0] = 1;
for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++)
//如果遇到障碍物,直接跳出循环
dp[0][i] = 1;
//开始遍历
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1)continue;//如果遇到障碍物,直接continue跳过该层循环
//上面这个continue的意思,就是留着(i,j)这个位置不处理了,它就是0,不用管它
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};

尾声

看到这里相信你对这两道OJ已经有一定的理解了,其实路径问题是一个非常经典的我们必须要掌握的问题。
在走之前,可以再看看博主的这些专栏内容对你是否有帮助:有的话请不要吝啬你们的点赞收藏关注和转发噢!

数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏Leetcode想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!

【算法】【动态规划】动规dp解决不同路径两道经典OJ笔试题【力扣62-力扣63】超详细的动态规划入门详解,掌握动态规划的解题方法的更多相关文章

  1. 算法题16 贪吃的小Q 牛客网 腾讯笔试题

    算法题16 贪吃的小Q 牛客网 腾讯笔试题 题目: 链接:https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9 ...

  2. 蓝桥杯 试题 算法提高 宰羊 DP解决

    问题描述 炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃. 炫炫家有N只羊,羊圈排成一排,标号1~N.炫炫每天吃掉一只羊(这食量!其实是放生啦),吃掉的羊的邻居会以为它被放生了,然后又会告诉他们的邻居 ...

  3. 状压DP入门详解+题目推荐

    在动态规划的题型中,一般叫什么DP就是怎么DP,状压DP也不例外 所谓状态压缩,一般是通过用01串表示状态,充分利用二进制数的特性,简化计算难度.举个例子,在棋盘上摆放棋子的题目中,我们可以用1表示当 ...

  4. 【算法】DP解决旅行路径问题

    问题描述 : After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice ...

  5. Edmonds_Karp 算法入门详解(转)

    转载自:http://blog.csdn.net/hsqlsd/article/details/7862903 有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点,通常规定为1号点.另一个点也 ...

  6. 针对初学者的A*算法入门详解(附带Java源码)

    英文题目,汉语内容,有点挂羊头卖狗肉的嫌疑,不过请不要打击我这颗想学好英语的心.当了班主任我才发现大一18本书,11本是英语的,能多用两句英语就多用,个人认为这样也是积累的一种方法. Thanks o ...

  7. Linux服务器上迁移项目路径,修改nginx配置,迁移及备份MongoDB数据库流程 (超详细)!!!

    缘由:客户服务器项目路径不是很合理,导致Jenkins自动部署时还需要添加路径后再更新部署,所以需要把项目路径统一和规范化. 迁移项目路径,保证路径合规,同时做好备份和迁移.迁移后先安装好依赖. 项目 ...

  8. KCF跟踪算法 入门详解

    一.算法介绍 KCF全称为Kernel Correlation Filter 核相关滤波算法.是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins ...

  9. 树形DP入门详解+题目推荐

    树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...

  10. 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题和DNS域名解析问题(图文详解)

    不多说,直接上干货! 问题情况描述如下: 普及知识:   /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf.  Ubun ...

随机推荐

  1. Codeforces Round #674 (Div. 3) (A - F题题解)

    A. Floor Number https://codeforces.com/contest/1426/problem/A 题意: 一个楼房房间号由 \(1\) 递增,一楼仅2个房间.给定一位用户的房 ...

  2. 利用gost实现pptp转socks5或http代理

    利用gost实现pptp转socks5或http代理 以debian10为例 1.安装pptp服务器端 sudo apt-get install pptpd #debian系统 编辑/etc/pptp ...

  3. SpringBoot发布https服务

    一.生成SSL证书 1.进入本地jdk的路径 cd D:\Program\jdk1.8.0_77\jre\lib\security cmd窗口生成证书HSoftTiger.keystore到D盘 ke ...

  4. MES系统初探(一)

    什么是MES系统 MES系统是制造执行系统(Manufacturing Execution System)的缩写,是一种用于监控.控制和优化制造过程的软件系统.它主要负责协调生产计划.生产调度.生产执 ...

  5. VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. 【rt-thread】移植touchgfx时出现如下错误和现象

    [问题描述] 基于cubemx生成的touchgfx工程,移植入rt-threadkeil编译报重复定义 加载到文件组中的文件奇妙的出现了 Src_ .Device_.i2c_.Keil_  前缀,这 ...

  7. 【TouchGFX】visua studio 自定义路径宏

    很好奇 touchgfx 的 visual studio 工程文件中路径符号 $(TouchGFXReleasePath)是哪里定义的,经查这就是一个宏替换 自定义宏方式  

  8. [转帖]技术分享| MySQL 的 AWR Report?— MySQL 状态诊断报告

    https://segmentfault.com/a/1190000039959767     作者:秦福朗 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查.热爱 IT,喜欢在互联网 ...

  9. [转帖]RHEL/CentOS 7的systemd target及其中的multi-user.target

    在RHEL/CentOS 6中,使用SysV init和Upstart,通过预定义一组Runlevels(从0到6)表示不同的执行模式. [root@myhost app]# ll /etc/rc.d ...

  10. [转帖]ESX/ESXi 主机上的每个插槽中安装了多少内存

    https://www.cnblogs.com/reachos/p/11242302.html 要确定在 ESX/ESXi 主机上的每个插槽中安装了多少内存,请执行以下操作: 1. 启动ssh服务 2 ...