刷题之动态规划-路径问题

前言

大家好,我是jiantaoyab,开始刷动态规划的题目了,要特别注意初始化的时候给什么值。

动态规划5个步骤

  1. 状态表示 :dp数组中每一个下标对应值的含义是什么->dp[i]表示什么
  2. 状态转移方程: dp[i] 等于什么
  3. 1 和 2 是动态规划的核心步骤,第三步是初始化,保证填表的时候不越界
  4. 填表顺序:为了保证填写当前状态的时候,所需要的状态已经计算过
  5. 返回值

第 N 个泰波那契数

image-20240327082552013

题目分析

image-20240327082930486

我们用动态规划来解决

  1. dp[i] : 表示第i个泰波那契数
  2. dp[i] = dp[i - 3] + dp[i - 2] + dp [i - 1]
  3. 初始化: dp[0] = 0; dp[1] = 1 ; dp[2] = 1;
  4. 填表顺序:从左道右
  5. 返回值:dp[n]

代码

class Solution {
public:int tribonacci(int n) {if(n == 0) return 0;if(n == 1 || n == 2) return 1;int dp[1000] = {0};dp[0] = 0, dp[1] = 1, dp[2] = 1;for(int i = 3; i <= n; i++){dp[i] = dp[i-3] + dp[i-2] + dp[i-1];}return dp[n];}
};

image-20240327085917789

优化一下,可以看到只需要三个变量也能完成这个操作。

class Solution {
public:int tribonacci(int n) {if(n == 0) return 0;if(n == 1 || n == 2) return 1;int a = 0, b = 1, c = 1, d = 0;for(int i = 3; i <= n; i++){d = a + b + c;a = b;b = c;c = d;}return d;}
};

三步问题

image-20240327090422340

image-20240327093241354

题目分析

  1. dp[i] :表示去到当前台阶有几种方法
  2. dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
  3. 初始化 dp[1] = 1; dp[2] = 2; dp[3] = 4;
  4. 填表顺序从左到右
  5. 返回值 d[n]

代码

class Solution {
public:int waysToStep(int n) {vector<int>dp(n + 1);if(n == 1 || n == 2) return n;if(n == 3) return 4;const int MOD = 1000000007;dp[1] = 1; dp[2] = 2; dp[3] = 4;for(int i = 4; i <= n; i++){dp[i] = ((dp[i-3] + dp[i-2]) % MOD + dp[i-1]) % MOD;}return dp[n];}
};

使用最小花费爬楼梯

image-20240327094348136

题目分析

image-20240327102746297

  1. dp[i]:到达 i位置的最小花费
  2. dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
  3. 初始化:dp[0] = dp[1] = 0;
  4. 填表顺序:从左到右
  5. 返回值:dp[n]

代码

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n + 1);dp[0] = dp[1] = 0;for(int i = 2; i <= n; i++){dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);}return dp[n];}
};

解码方法

image-20240328121136322

题目分析

image-20240328124124445

  1. dp[i]:是表示是 i 位置为结尾的解码方法总数
  2. dp[i] = dp[i - 1] + dp [i - 2];
  3. 初始化:dp[0] = 0 / 1 dp[1] = 0/ 1/ 2
  4. 填表顺序:从左到右
  5. 返回值:dp[n - 1]

代码

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp (n);//初始化dp[0] = s[0] != '0';if(n == 1) return dp[0];if(s[0] != '0' && s[1] != '0') dp[1] += 1;int tmp = (s[0] - '0') * 10 + (s[1] - '0');if(tmp >= 10 && tmp <= 26) dp[1] += 1;//处理剩下的for(int i = 2; i < n; i++){//单独一个字符if(s[i] != '0') dp[i] += dp[i - 1];//2个字符int tmp = (s[i - 1] - '0') * 10 + (s[i] - '0');if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2];}return dp[n - 1];}
};

优化代码

image-20240328132736524

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp (n + 1); //初始化dp[0] = 1;dp[1] = s[1 - 1] != '0';  //处理剩下的for(int i = 2; i <= n; i++){//单独一个字符if(s[i - 1] != '0') dp[i] += dp[i - 1];//2个字符int tmp = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');if(tmp >= 10 && tmp <= 26) dp[i] += dp[i - 2];}return dp[n];}
};

不同路径

image-20240328133027939

题目分析

image-20240328142217131

  1. dp[i] [j]:走到 i,j 位置有多少种方式
  2. dp[i] [j] = dp[i] [j - 1] + dp[i - 1] [j];
  3. 初始化:新增加一列和一行
  4. 填表顺序:从上到下,左到右填表
  5. 返回值:dp[m] [n]

代码

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1, vector<int>(n+1));//初始化dp[0][1] = 1;for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){dp[i][j] = dp[i][j - 1] + dp[i - 1][j];}}return dp[m][n];}
};

不同路径 II

image-20240328142046409

题目分析

  1. dp [i] [j] : 到达i,j这个位置有多少种方法
  2. dp [i] [j] = dp[i - 1] [j] + dp [i] [j - 1]
  3. 初始化:dp[1] [0] = 1;
  4. 填表顺序:从上到下,从左到右
  5. 返回值: dp[m] [n]

代码

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size(), n = obstacleGrid[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));//初始化dp[1][0] = 1;for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(obstacleGrid[i - 1][j - 1] != 1)dp[i][j] = dp[i - 1][j] + dp[i][j -1];}}return dp[m][n];} 
};

珠宝的最高价值

image-20240329083509134

题目分析

  1. dp [i] [j] : 到达i,j这个位置的最高价值
  2. dp [i] [j] =max(dp[i-1] [j], dp[i] [j-1]) + frame[i-1] [j-1];
  3. 初始化:默认都是0不用初始化
  4. 填表顺序:从上到下,从左到右
  5. 返回值: dp[m] [n]

代码

class Solution {
public:int jewelleryValue(vector<vector<int>>& frame) {int m = frame.size(), n = frame[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){           dp[i][j] =  max(dp[i-1][j], dp[i][j-1]) + frame[i-1][j-1];}return dp[m][n];}
};

下降路径最小和

image-20240329090000519

题目分析

  1. dp[i] [j] : 到达i,j位置的最小下路径
  2. dp[i] [j] : min(dp[i+1] [j-1], dp[i+1] [j+1], dp[i+1] [j]) + matrix[i-1] [j - 1]
  3. 初始化:多给1行 和2列
  4. 填表顺序:从上到下,从左到右
  5. 返回值: 最后一行的最小值

image-20240329093844878

代码

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int n = matrix.size();vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));for(int j = 0; j < n + 2; j++) dp[0][j] = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){dp[i][j] = min(min(dp[i-1][j-1], dp[i-1][j]), dp[i-1][j+1]) + matrix[i-1][j-1];}}      //返回值int ret = INT_MAX;for(int j = 1; j <= n; j++){ret = min(ret, dp[n][j]);}return ret;}
};

最小路径和

image-20240329094117164

代码

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));dp[1][0] = dp[0][1] = 0; for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i - 1][j - 1];}return dp[m][n];}
};

地下城游戏(反着来)

image-20240329102706154

题目分析

image-20240329105223745

  1. dp[i] [j] : 从i,j位置出发,到达终点所需要的最低

  2. dp[i] [j] = min(dp[i] [j + 1], dp[i + 1] [j]) - dungeon[i] [j];

  3. 初始化 dp[m +1] [n -1] = dp [m - 1] [n + 1] = 1;

  4. 填表顺序:从下到上,从右到左

  5. 返回值: dp[0] [0]

代码

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int m = dungeon.size(), n = dungeon[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));//初始化dp[m][n -1] = dp [m - 1][n] = 1;for(int i = m - 1; i >= 0; i--)for(int j = n - 1; j >= 0; j--){dp[i][j] = min(dp[i][j + 1], dp[i + 1][j]) - dungeon[i][j];dp[i][j] = max(1, dp[i][j]); //如果血包很大,会出现负数,这里取1就是最低血}return dp[0][0];}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NRF52832修改OTA升级时的bootloader蓝牙MAC

NRF52832在OTA升级时&#xff0c;修改了APP的蓝牙MAC会导致无法升级&#xff0c;原因是OTA程序的蓝牙MAC没有被修改所以手机扫描蓝牙时无法连接 解决办法 在bootloader的程序里面加入修改蓝牙mac地址的代码实现原理&#xff1a; 在bootloader蓝牙广播开启之前修改蓝牙mac 通…

轻松编辑照片,无需下载!2024年最受推荐的在线PS替代工具

设计领域&#xff0c;Adobe Photoshop无疑是最受欢迎的软件之一。然而&#xff0c;PS对初学者来说可能很复杂&#xff0c;需要安装在计算机上&#xff0c;更不用说相对昂贵的价格了。这些因素使得PS在线网页替代设计工具越来越受欢迎。今天&#xff0c;我们将为您介绍一些优秀的…

[Leetcode笔记] 滑动窗口相关

前言 今天做leetcode的时候遇到一道滑动窗口相关的题目&#xff0c;题目具体内容如下&#xff1a; 思路 这道题很显然需要用到滑动窗口&#xff0c;肯定不是让你傻乎乎一遍一遍去遍历数组的内容然后遍历尝试 流程&#xff1a; 先算数组的总大小。使用while计算滑动窗口数…

第十二届蓝桥杯JavaA组省赛真题 - 相乘

解题思路&#xff1a; 暴力 public class Main {public static void main(String[] args) {for (long i 1; i < 1000000007; i) {if (i * 2021 % 1000000007 999999999) System.out.print(i);else System.out.print(0);}} }

LeetCode-统计完全连通分量的数量

题目要求&#xff1a; 给你一个整数 n 。现有一个包含 n 个顶点的 无向 图&#xff0c;顶点按从 0 到 n - 1 编号。给你一个二维整数数组 edges 其中 edges[i] [ai, bi] 表示顶点 ai 和 bi 之间存在一条 无向 边。 返回图中 完全连通分量 的数量。 如果在子图中任意两个顶点…

揭秘速成软件书:彩虹之下的真相

在这个信息爆炸的时代&#xff0c;我们常常被诱惑性的标题所吸引&#xff1a;“三天掌握Python编程”&#xff0c;“一周精通Photoshop”&#xff0c;书架上堆满了各种各样的速成指南&#xff0c;这些声称能迅速提升技能的书籍&#xff0c;真的能做到它们所承诺的吗&#xff1f…

前任在代码里下毒,支付下单居然没加幂等?

首先蜗牛和大家从以下几个方面好好剖析一下接口幂等吧。 什么是接口幂等 比较专业的术语&#xff1a;其任意多次执行所产生的影响均与第一次执行的影响相同。 也就是多次调用的情况下&#xff0c;接口最终得到的结果是一致的。 那么为什么需要幂等呢&#xff1f; 那么哪些接…

数据结构03:栈、队列和数组 队习题01[C++]

考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构03&#xff1a;栈、队列和数组_-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为链表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题…

实战-后台管理系统SQL注入漏洞

对于edu来说&#xff0c;是新人挖洞较好的平台&#xff0c;本次记录一次走运的捡漏0x01 前景 在进行fofa盲打站点的时候&#xff0c;来到了一个后台管理处看到集市二字&#xff0c;应该是edu站点 确认目标身份&#xff08;使用的quake进行然后去ipc备案查询&#xff09; 网…

Qt实现Kermit协议(一)

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…

关于视场角,你需要知道这些!

视场角在光学工程中又称视场&#xff0c;视场角的大小决定了光学仪器的视野范围。视场角又可用FOV&#xff08;Field of view&#xff09;表示&#xff0c;其与焦距的关系如下&#xff1a;像高 EFL*tan (半FOV)&#xff1b;EFL为焦距&#xff1b;FOV为视场角。即以入瞳位置为顶…

一个包一条命令,我实现了对整个前端项目代码的校验

在现代前端开发中&#xff0c;代码校验与风格统一不仅是良好编程习惯的体现&#xff0c;更是提升项目质量、保障代码可维护性与减少潜在bug的关键环节。然而&#xff0c;面对诸如ESLint、Commitlint、Stylelint等多样化的校验工具&#xff0c;以及针对React、Vue等不同前端框架…

笔记本电脑上部署LLaMA-2中文模型

尝试在macbook上部署LLaMA-2的中文模型的详细过程。 &#xff08;1&#xff09;环境准备 MacBook Pro(M2 Max/32G); VMware Fusion Player 版本 13.5.1 (23298085); Ubuntu 22.04.2 LTS; 给linux虚拟机分配8*core CPU 16G RAM。 我这里用的是16bit的量化模型&#xff0c;…

java线程(一)--进程,多线程,synchronized和lock锁,JUC,JUnit

Java线程入门 单核CPU和多核CPU的理解 单核CPU&#xff0c;其实是一种假的多线程&#xff0c;因为在一个时间单元内&#xff0c;也只能执行一个线程的任务。例如&#xff1a;虽然有多车道&#xff0c;但是收费站只有一个工作人员在收费&#xff0c;只有收了费才能通过&#xf…

LeetCode226:反转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 解题思想 使用前序遍历和后序遍历比较方便 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) return root;swap(root->left, root…

什么是ISP住宅IP?相比于普通IP它的优势是什么?

什么是ISP住宅IP&#xff1f; ISP住宅IP是指由互联网服务提供商&#xff08;ISP&#xff09;分配给住宅用户的IP地址。它是用户在家庭网络环境中连接互联网的标识符&#xff0c;通常用于上网浏览、数据传输等活动。ISP住宅IP可以是动态分配的&#xff0c;即每次连接时都可能会…

BOM系统:贯穿制造全程的管理利器

在制造行业中&#xff0c;BOM系统的应用已经成为提高生产效率、降低成本和确保产品质量的关键因素。BOM系统作为产品结构和物料清单的管理工具&#xff0c;为制造企业提供了全面的控制和协同能力。 1.产品设计与开发&#xff1a;在产品设计阶段&#xff0c;BOM系统为工程师提供…

基于自动编码器的预训练模型方法模型预训练方法RetroMAE和RetroMAE-2

文章目录 RetroMAERetroMAE详情编码解码增强解码 RetroMAE-2RetroMAE-2详情编码[CLS]解码OT解码和训练目标向量表征 总结参考资料 RetroMAE RetroMAE 出自论文《RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder》&#xff0c;是一种针对于…

ES-7.12-官方文档阅读-ILM-Automate rollover

教程&#xff1a;使用ILM自动化滚动创建index 当你持续将带有时间戳的文档index到Elasticsearch当中时&#xff0c;通常会使用数据流&#xff08;data streams&#xff09;以便可以定义滚到到新索引。这是你能够实施一个hot-warm-cold架构来满足你的性能要强&#xff0c;控制随…

OpenHarmony实战:RK3568 开发板镜像烧录指南

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 RK3568 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。Hihoop&#xff…