【算法】【动态规划】动规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. 20级训练赛Round #4

    给20级学弟学妹们带带榜单 A - 凯少的动作序列 枚举情况替换即可 #include <bits/stdc++.h> using namespace std; using ll = lo ...

  2. 华东交通大学2019年ACM 双基 程序设计竞赛 个人题解(A - K)

    目前先放几道题面,等晚上做完实验补 Update:A ~ D,更新剩余的题面(题面复制会有链接水印,懒得一一去除.直接截图) A.签到 真·签到题 输出祝贺祖国成立70周年!即可 B.欧涛的烦恼 思路 ...

  3. 解决SUM函数返回为NULL

    解决SUM函数返回为NULL SUM函数的作用:计算某一字段中所有行的数值和, 使用SUM函数进行对符合条件的结果行数进行求和. 问题产生: sum 求和时会对 null 进行过滤,不计算,但如果没有 ...

  4. linux有用的命令

    如下是一些在工作中偶尔会用到,每次用的时候都要查一查资料的命令这里总结一下方便今后查阅 0.查看操作系统版本 cat /etc/issue  或 cat /etc/redhat-release 1.后 ...

  5. vue2.x封装svg组件并使用

    https://blog.csdn.net/ChickenBro_/article/details/134027803

  6. python进阶(4)--字典

    文档目录: 一.一个简单的字典二.字典-增删改三.遍历字典四.字典嵌套 ---------------------------------------分割线:正文------------------- ...

  7. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.05)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  8. 精通 VS 调试技巧,学习与工作效率翻倍!

    ​ 欢迎大家来到贝蒂大讲堂 ​ 养成好习惯,先赞后看哦~ ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty's blog ​ 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预期的情 ...

  9. [转帖]Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南

    https://zhuanlan.zhihu.com/p/417472115 什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能, ...

  10. [转帖]ARMv8架构概述、相关技术文档以及ARMv8处理器简介

    ARMv8架构 文章目录 ARMv8架构 参考文档 ARMv8架构的概述 从32位到64位的变化The changes from 32 bits to 64 bits 1,Larger registe ...