当前位置: 首页 > news >正文

代码随想录笔记--动态规划篇

1--动态规划理论基础

动态规划经典问题:① 背包问题;② 打家劫舍;③ 股票问题; ④ 子序列问题;

动态规划五部曲:

        ① 确定 dp 数组及其下标的含义;

        ② 确定递推公式;

        ③ 确定 dp 数组的初始化;

        ④ 确定遍历顺序,一般为从左到右;

        ⑤ 打印 dp 数组,一般用于检查;

2--斐波那契数

主要思路:

        经典动态规划,dp[i] 表示第 i 个数的斐波那契数;递推公式为:dp[i] = dp[i-1] + dp[i - 2];初始化dp[0] = 1,dp[1] = 1;遍历顺序从左到右;

#include <iostream>
#include <vector>class Solution {
public:int fib(int n) {if(n <= 1) return n;std::vector<int> dp(n+1, 0);dp[0] = 0; dp[1] = 1;for(int i = 2; i <= n; i++){dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};int main(int argc, char argv[]){int test = 2;Solution S1;int res = S1.fib(test);std::cout << res << std::endl;return 0;
}

3--爬楼梯

主要思路:

        经典动态规划,dp[i] 表示到达第 i 阶楼梯的方法数;递推公式为 dp[i] = dp[i - 1] + dp[i - 2];初始化dp[1] = 1, dp[2] = 2;遍历顺序从左到右;

#include <iostream>
#include <vector>class Solution {
public:int climbStairs(int n) {if(n <= 2) return n; std::vector<int> dp(n+1, 0);dp[1] = 1, dp[2] = 2;for(int i = 3; i <= n; i++){dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};int main(int argc, char argv[]){int n = 2;Solution S1;int res = S1.climbStairs(n); std::cout << res << std::endl;return 0;
}

4--使用最小花费爬楼梯

主要思路:

        dp[i] 表示到达第 i 阶楼梯需要的最小花费;初始化 dp[0] = 0, dp[1] = 0,因为可以从 0 和 1 出发,因此不需要花费;递推公式为 dp[i] = std::min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);默认从左到右遍历;

#include <iostream>
#include <vector>class Solution {
public:int minCostClimbingStairs(std::vector<int>& cost) {std::vector<int> dp(cost.size()+1, 0); // 到达第i阶的最小花费dp[0] = 0;dp[1] = 0;for(int i = 2; i <= cost.size(); i++){dp[i] = std::min(cost[i-2]+dp[i-2], cost[i-1]+dp[i-1]);}return dp[cost.size()];}
};int main(int argc, char argv[]){// cost = [1,100,1,1,1,100,1,1,100,1]std::vector<int> cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};Solution S1;int res = S1.minCostClimbingStairs(cost);std::cout << res << std::endl;return 0;
}

5--不同路径

主要思路:

        dp[i][j] 表示到达 (i, j) 位置的路径数,初始化两个边界 dp[i][0] = 1,dp[0][j] = 1;状态转移方程为:dp[i][j] = dp[i-1][j] + dp[i][j-1];遍历顺序为从上到下,从左到右;

#include <iostream>
#include <vector>class Solution {
public:int uniquePaths(int m, int n) {std::vector<std::vector<int>> dp(m, std::vector<int>(n, 0));// 初始化for(int i = 0; i < m; i++) dp[i][0] = 1;for(int j = 0; j < n; j++) dp[0][j] = 1;// 遍历for(int r = 1; r < m; r++){for(int c = 1; c < n; c++){dp[r][c] = dp[r-1][c] + dp[r][c-1];}}return dp[m-1][n-1];}
};int main(int argc, char argv[]){// m = 3, n = 7int m = 3, n = 7;Solution S1;int res = S1.uniquePaths(m, n);std::cout << res << std::endl;return 0;
}

6--不同路径II

主要思路:

        与上题类似,dp[i][j] 表示到达 (i, j) 位置的路径数,初始化两个边界 dp[i][0] = 1,dp[0][j] = 1(确保边界没有障碍物,有障碍物初始化为0);状态转移方程为:(i, j)不是障碍物则 dp[i][j] = dp[i-1][j] + dp[i][j-1],(i, j)为障碍物则dp[i][j] = 0;遍历顺序为从上到下,从左到右;

#include <iostream>
#include <vector>class Solution {
public:int uniquePathsWithObstacles(std::vector<std::vector<int>>& obstacleGrid) {int m = obstacleGrid.size(), n = obstacleGrid[0].size();if(obstacleGrid[m-1][n-1] == 1) return 0;std::vector<std::vector<int>> dp(m, std::vector<int>(n, 0));// 初始化for(int i = 0; i < m && obstacleGrid[i][0] != 1; i++) dp[i][0] = 1;for(int j = 0; j < n && obstacleGrid[0][j] != 1; j++) dp[0][j] = 1;// 遍历for(int r = 1; r < m; r++){for(int c = 1; c < n; c++){if(obstacleGrid[r][c] == 1) dp[r][c] = 0; // 障碍else dp[r][c] = dp[r-1][c] + dp[r][c-1];}}return dp[m-1][n-1];}
};int main(int argc, char argv[]){// obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]std::vector<std::vector<int>> test = {{0, 0, 0}, {0, 1, 0}, {0, 0, 0}};Solution S1;int res = S1.uniquePathsWithObstacles(test);std::cout << res << std::endl;return 0;
}

7--整数拆分

主要思路:

        dp[i] 表示整数 i 拆分后的最大乘积;初始化dp[0] = 0, dp[1] = 0, dp[2] = 1; 状态转移方程为:dp[i] = max(dp[i], max(j*(i-j), j * dp[i-j]));

#include <iostream>
#include <vector>class Solution {
public:int integerBreak(int n) {std::vector<int> dp(n+1, 0);// 初始化dp[0] = 0, dp[1] = 0, dp[2] = 1;// 遍历for(int i = 3; i <= n; i++){for(int j = 0; j <= i/2; j++){dp[i] = std::max(dp[i], std::max(j*(i-j), j * dp[i-j]));}}return dp[n];}
};int main(int argc, char argv[]){// n = 10int test = 10;Solution S1;int res = S1.integerBreak(test);std::cout << res << std::endl;return 0;
}

8--不同的二叉搜索树

主要思路:

        dp[i] 表示由 i 个数字构成的不同二叉搜索树的数目;

        初始化:dp[0] = 1;

        状态转移方程:dp[i] += dp[j-1] * dp[i-j],0 <= j <= i;其中 dp[j-1] 来构成 j 的左子树,dp[i-j] 来构成 j 的右子树;

         遍历顺序:两个 for 循环,第 1 个 for 循环遍历 1 - n,第二个 for 循环遍历 1 - i;

#include <iostream>
#include <vector>class Solution {
public:int numTrees(int n) {std::vector<int> dp(n+1, 0);// 初始化dp[0] = 1;// 遍历for(int i = 1; i <= n; i++){for(int j = 1; j <= i; j++){dp[i] += dp[j-1] * dp[i-j];}}return dp[n];}
};int main(int argc, char *argv[]) {// n = 3int test = 3;Solution S1;int res = S1.numTrees(test);std::cout << res << std::endl;return 0;
}

9--

相关文章:

代码随想录笔记--动态规划篇

1--动态规划理论基础 动态规划经典问题&#xff1a;① 背包问题&#xff1b;② 打家劫舍&#xff1b;③ 股票问题&#xff1b; ④ 子序列问题&#xff1b; 动态规划五部曲&#xff1a; ① 确定 dp 数组及其下标的含义&#xff1b; ② 确定递推公式&#xff1b; ③ 确定 dp 数组…...

vue之vuex

Vuex 是 Vue.js 的一个状态管理模式和库&#xff0c;为应用中的所有组件提供了一个集中式的存储管理&#xff0c;并提供了一种强大的方式来管理应用的状态。Vuex 包含以下核心概念&#xff1a; State&#xff1a;定义了应用的状态&#xff0c;类似于组件中的 data。 Getters&a…...

ISO 26262 系列学习笔记 ———— ASIL定义(Automotive Safety Integration Level)

文章目录 介绍严重度&#xff08;Severity&#xff09;暴露概率&#xff08;Probability of Exposure&#xff09;可控性&#xff08;Controllability&#xff09; 介绍 如果没有另行说明&#xff0c;则应满足ASIL A、B、C和D各分条款的要求或建议。这些要求和建议参考了安全目…...

代码随想录 第8章 二叉树

1、理论知识 &#xff08;1&#xff09;、满二叉树 如果一棵二叉树只有度为0的节点和度为2的节点&#xff0c;并且度为0的节点在同一层上&#xff0c;则这棵二叉树为满二叉树。 &#xff08;2&#xff09;、完全二叉树 除了底层节点可能没有填满&#xff0c;其余每层的节点…...

计算机网络工程师多选题系列——计算机网络

2 计算机网络 2.1 网络技术基础 题型1 TCP/IP与ISO模型的问题 TCP/IP由IETF制定&#xff0c;ISO由OSI制定&#xff1b; TCP/IP分为四层&#xff0c;分别是主机-网络层、互联网络层、传输层和应用层&#xff1b;OSI分为七层&#xff0c;分别是物理层、数据链路层、网络层(实…...

Zabbix5.0_介绍_组成架构_以及和prometheus的对比_大数据环境下的监控_网络_软件_设备监控_Zabbix工作笔记001

z 这里Zabbix可以实现采集 存储 展示 报警 但是 zabbix自带的,展示 和报警 没那么好看,我们可以用 grafana进行展示,然后我们用一个叫睿象云的来做告警展示, 会更丰富一点. 可以看到 看一下zabbix的介绍. 对zabbix的介绍,这个zabbix比较适合对服务器进行监控 这个是zabbix的…...

Spring | 事件监听器应用与最佳实践

引言 在复杂的软件开发环境中&#xff0c;组件之间的通信和信息交流显得尤为重要。Spring框架&#xff0c;作为Java世界中最受欢迎的开发框架之一&#xff0c;提供了一种强大的事件监听器模型&#xff0c;使得组件间的通信变得更加灵活和解耦。本文主要探讨Spring事件监听器的…...

正点原子lwIP学习笔记——NETCONN接口简介

1. NETCONN接口简介 NETCONN API 使用了操作系统的 IPC 机制&#xff0c; 对网络连接进行了抽象&#xff0c;使用同一的接口完成UDP和TCP连接。 NETCONN API接口是在RAW接口基础上延申出来的一套API接口 首先会调用netconn_new创建一个pcb控制块&#xff0c;其实际是一个宏定…...

PHP自动识别采集何意网址文章正文内容

在做PHP采集内容时&#xff0c;用过querylist采集组件&#xff0c;但是这个插件采集页面内容时&#xff0c;都必须要写个采集选择器。这样比较麻烦&#xff0c;每个文章页面都必须指定一条采集规则 。就开始着手找一个插件可以能自动识别任意文章url正文内容并采集的&#xff0…...

区块链实验室(27) - 区块链+物联网应用案例

分享最新的区块链物联网应用案例&#xff1a;HPCLS-BC...

NPU上PyTorch模型训练问题案例

在昇腾AI处理器上训练PyTorch框架模型时&#xff0c;可能由于环境变量设置问题、训练脚本代码问题&#xff0c;导致打印出的堆栈报错与实际错误并不一致、脚本运行异常等问题&#xff0c;那么本期就分享几个关于PyTorch模型训练问题的典型案例&#xff0c;并给出原因分析及解决…...

出现 conda虚拟环境默认放在C盘 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 方法一3.2 方法二1. 问题所示 通过conda配置虚拟环境的时候,由于安装在D盘下,但是配置的环境默认都给我放C盘 通过如下命令:conda env list,最后查看该环境的确在C盘下 2. 原理分析 究其根本原因,这是因为默认路径没有足够的…...

Ubuntu Postgresql开机自启动服务

1. 建立service文件 sudo vim /etc/systemd/system/postgresql.service2. postgresql service文件 [Unit] DescriptionPostgreSQL 14 database server Documentationman:postgres(1) Documentationhttp://www.postgresql.org/docs/14/static/ Afternetwork.target[Service] T…...

COTS即Commercial Off-The-Shelf 翻译为“商用现成品或技术”或者“商用货架产品”

COTS 使用“不再做修理或改进”的模式出售的商务产品 COTS即Commercial Off-The-Shelf 翻译为“商用现成品或技术”或者“商用货架产品”&#xff0c;指可以采购到的具有开放式标准定义的接口的软件或硬件产品&#xff0c;可以节省成本和时间。 中文名 商用现成品或技术 外文…...

idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…...

Linux nohup

nohup 命令用于在 Linux 中将命令或程序在后台运行&#xff0c;并且在终端关闭后仍然保持运行。 nohup命令 描述 nohup 命令用于将命令或程序以不受终端挂断影响的方式在后台运行。 语法 nohup command [arguments] &参数 command&#xff1a;要在后台运行的命令或程…...

Linux 常见问题

1. 使用 sudo 命令时&#xff0c;提示 is not in the sudoers file. 是由于对应用户没有添加到 sudoers 文件中&#xff0c;可以在该文件中指定用户权限。运行以下命令即可打开该文件&#xff1a; visudo 添加上对应用户的权限 Ctrl x 退出保存即可。 2. Debian 新建的普通用…...

仕达利恩飞讯软件TPM设备管理项目正式启动,向数字化再迈一步

9月25日&#xff0c;仕达利恩(惠州)科技有限公司&#xff08;以下简称“仕达利恩”&#xff09;设备智能数采项目启动会成功召开&#xff0c;仕达利恩首席崔浩渊、杨翠琼次长携项目主要负责人共同出席本次启动会。为解决仕达利恩现阶段生产过程中的设备管理、设备配件仓管理以及…...

【算法】分治法

文章目录 概念原理和步骤代码示例 总结 概念 分治法&#xff08;Divide and Conquer&#xff09;是一种算法设计策略&#xff0c;其思想是将一个大问题划分为若干小规模的子问题&#xff0c;然后递归地解决每个子问题&#xff0c;并将它们的解合并起来以得到原始问题的解。分治…...

Rabbit消息的可靠性

生产者重连 消费者重试 Confirm模式简介 消息的confirm确认机制&#xff0c;是指生产者投递消息后&#xff0c;到达了消息服务器Broker里面的exchange交换机&#xff0c;则会给生产者一个应答&#xff0c;生产者接收到应答&#xff0c;用来确定这条消息是否正常的发送到Broker…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...