动态规划 DP (一)

article/2025/9/29 9:11:04

1.动态规划(Dynamic Programming,简称DP)

维基百科的定义说的很清楚:

动态规划不能解决所有的问题, 只能应用于有最优子结构的问题。例如背包问题、最长公共子序列问题、最短路径问题等。
最优子结构:局部最优解能决定全局最优解。
动态规划算法通常分为三个步骤:定义状态、设计状态转移方程、计算最优解。
动态规划算法的优点是可以避免重复计算,从而提高算法的效率。

 

2.一维动态规划

1)力扣icon-default.png?t=N5K3https://leetcode.cn/problems/climbing-stairs/

这道题思路很清楚,每次只能爬一个或两个台阶,所有当站在第10个台阶时,要么从第8个台阶走两步上来,要么从第9个台阶走一步上来。

所以这是一个有最优子结构的问题,局部最优解可以决定全局最优解。只要走每一步时,都算清楚走法,那么到了最后一步,得到的就是正确的走法。

转移方程:f(n) = f(n-1) + f(n-2)  n>2

                  f(1) = 1  f(2) = 2

写代码的时候可以用vector存储每一步的走法,但考虑到节省空间,也可以只记录最近两步的走法,因为每次计算,只涉及前两步。

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

2)

力扣icon-default.png?t=N5K3https://leetcode.cn/problems/house-robber/当决定偷第3个房间时,就不能偷第2个房间了,只能偷第1个房间。

当决定不偷第3个房间时,那就可以偷第1个房间和第2个房间中金额更高的房间。

偷不偷第3个房间,则取决于上面两种情况哪种获得的总金额更高。

所以转移方程为: dp[i] = max(dp[i-2]+nums[i], dp[i-1])

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n==0) return 0;if(n<2) return nums[0];int a = 0, b = 0, c;for(int i=0;i<n;i++){c = max(b,a+nums[i]);a = b;b = c;}return c;}
};

 

3)力扣icon-default.png?t=N5K3https://leetcode.cn/problems/arithmetic-slices/这道题要注意审题,子数组说的是连续序列,所以依次遍历每个元素,判断是否满足:

(nums[i]-nums[i-1]) == (nums[i-1]-nums[i-2])

比如:

nums = [1,2,3,4]

因为题目要求至少三个元素,所以从第三个元素开始判断,很明显(3-2)==(2-1),

所以[1,2,3]为一个等差数列。

接着遍历到第四个元素,也满足等式(4-3)==(3-2),这时候新增了两个等差序列,

一个是[2,3,4],另一个是前一个等差数列的延续[1,2,3,4]。

所以当遍历到一个元素满足(nums[i]-nums[i-1]) == (nums[i-1]-nums[i-2])这个条件时,

 [ nums[i-2], nums[i-1], nums[i] ]构成一个新的等差数列,

接着再在nums[i-1]结尾的等差数列后加上nums[i],得到了新的dp[i-1]个等差数列。

所以转移方程为:

dp[i] = dp[i-1] + 1 当(nums[i]-nums[i-1]) == (nums[i-1]-nums[i-2])时

dp数组求和,得到的就是等差数列的数量

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();if(n<3) return 0;int res = 0;vector<int> dp(n,0);for(int i=2;i<n;i++){if((nums[i]-nums[i-1])==(nums[i-1]-nums[i-2])){dp[i] = dp[i-1] + 1;res += dp[i];}}return res;}
};


http://chatgpt.dhexx.cn/article/xyGjRDGx.shtml

相关文章

动态规划(DP)通俗讲解

参考 徐凯强 Andy 动态规划中递推式的求解方法不是动态规划的本质。 我曾经作为省队成员参加过NOI&#xff0c;保送之后也给学校参加NOIP的同学多次讲过动态规划&#xff0c;我试着讲一下我理解的动态规划&#xff0c;争取深入浅出。希望你看了我的答案&#xff0c;能够喜欢上动…

【算法之动态规划(一)】动态规划(DP)详解

一、基本概念 动态规划(dynamic programming)是 运筹学 的一个分支&#xff0c;是求解决策过程(decision process)最优化的数学方法。20世纪50年代初 美国 数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时&#xff0c;提出了著名的最优…

动态规划(dp)的总结

动态规划(dp)的总结 动态规划只要找到子问题&#xff0c;写起来就很简单&#xff0c;通常最多就二维dp数组即可解决问题&#xff0c;顶多再来个双dp&#xff0c;再加点逆向思维……下面列出我见过的子问题&#xff0c;别栽在dp上了&#xff0c;求求了。 能用dp做&#xff0c;…

数据结构与算法——动态规划(DP)

文章目录 1. 应用场景2. DP状态2.1 最优子结构2.2 无后效性2.3 解题思路 3. 问题类别3.1 线性DP3.1.1 经典问题3.1.1.1 [LeetCode 300. 最长上升子序列](https://leetcode-cn.com/problems/longest-increasing-subsequence/)3.1.1.2 [LeetCode 1143. 最长公共子序列](https://l…

关于动态规划(dp)

**动态规划(DP) 一.基本概念 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称DP&#xff09;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 它针对满足…

动态规划(DP)的原理、实现及应用

文章目录 1. 由一个例子说开&#xff1a; 斐波那契&#xff08;fibonacci&#xff09;数列 性能测试原因分析2. 记忆化搜索3. 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09; 最优子结构总结一下这几个解法&#xff1a;几个例题 LeetCode 70 Climbing St…

Hi3519AV100与Hi3559AV100在芯片规格 上主要差异

表1-1简要对比了Hi3519AV100与Hi3559AV100在规格方面的差异&#xff0c;Hi3519AV100的具体规格请参见《Hi3519AV100 ultra-HD Mobile Camera SoC 用户指南》。

海思平台(hi3559av100)异构多系统的使用Linux(2*A53+2*A73)+liteos(A53)+liteos(M7)

在文档《SDK安装及升级使用说明》中有对linuxliteos异构多系统的烧写有介绍。这里对其中的一些注意的地方记录以下&#xff0c;以备查验。 由于我的目标是要搭建一个ISP调试环境&#xff0c;就是使用海思的ittp_stream工具能够连接上开发板&#xff0c;并能够实时查看摄像头的…

M302H-ZN-Hi3798MV300/MV300H-当贝纯净桌面-卡刷固件包

M302H-ZN-Hi3798MV300&#xff0f;MV300H-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用…

华为海思 hikey970 详细介绍

前几天申请到了华为的开发板&#xff1a;hikey970 用来做项目的。 板子是这样的: 下面是在网中收集到的信息总结&#xff1a; 基于麒麟970的AI智慧算力&#xff0c;HiKey 970除了支持CPU和GPU的AI运算外&#xff0c;还支持基于NPU的神经网络计算硬件加速。 公开资料显示&am…

海思Hi3519AV100 emmc flash方式 linux系统移植 hitool工具烧写

因为我这里的海思文档只有SPI NOR Flash方式的详细烧写步骤&#xff0c;没有emmc方式的&#xff0c;本文提供一个自己成功的案例仅供参考和记录 1. 准备SDK、安装交叉编译工具、编译osdrv 1.1 解压SDK包 将Hi3519AV100_SDK_Vx.x.x.x.tgz文件放入ubuntu系统下&#xff08;wind…

海思3559:MMZ内存、OS内存配置

前言 海思3559的DDR最大支持到8GB hi3559av100芯片的内存地址范围 (1)通过查阅数据手册可知《Hi3559AV100 专业型 Smart IP Camera SoC 用户指南》&#xff0c;芯片的内存地址范围是0x4000_0000-0x23FFF_FFFF&#xff0c;最大能支持8G内存&#xff1b;   (2)海思芯片把内存分…

劲爆!java架构师百度网盘

第一份资料:Kafka实战笔记 Kafka入门为什么选择KafkaKarka的安装、管理和配置Kafka的集群第一个Kafka程序afka的生产者 Kafka的消费者深入理解Kafka可靠的数据传递

10本Java架构师必读书籍推荐

##### 1.《大型网站系统与Java中间件开发实践》 本书围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍。从分布式系统的知识切入&#xff0c;让读者对分布式系统有基本的了解&#xff1b;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁&#xff1b;接着…

Java架构师需要哪些知识?

如何才能达到Java架构师技术要求标准&#xff1f;Java架构师需要熟练掌握复杂的数据结构和算法、熟练使用linux操作系统&#xff0c;Linux线上排除故障、熟悉tcp协议、系统集群、[负载均衡]、反向代理、动静分离&#xff0c;网站静态化、数据库设计能力、队列中间件等知识。 一…

JAVA架构师之路十六:设计模式之责任链模式

JAVA架构师之路十五&#xff1a;设计模式之策略模式 责任链模式 1. 责任链模式2. 登陆案例 3. 登陆案例优化 人生的游戏不在于拿了一副好牌&#xff0c;而在于怎样去打好坏牌&#xff0c;世上没有常胜将军&#xff0c;勇于超越自我者才能得到最后的奖杯。 1. 责任链模式 定义…

BAT面试高级进阶,Java架构师之路

说明 Java生鲜电商平台中由于采用了微服务架构进行业务的处理&#xff0c;买家&#xff0c;卖家&#xff0c;配送&#xff0c;销售&#xff0c;供应商等进行服务化&#xff0c;但是不可避免存在分布式事务的问题。 业界有很多的解决方案&#xff0c;对此我相信大家都百度一下…

JAVA架构师之路-视频学习

https://pan.baidu.com/s/1GK-HNdG_HsNTb_QQ6_L3Tg 目录&#xff1a; 第一套 JAVA高级架构师之旅 第2套 Java互联网架构师netty、mina、nio 第三套 阿里开源Dubbo 【第四套】互联网综合实战项目介绍 【第五套】高性能缓存Memcached服务深度原理及实战视频课程 【第六套】高级J…

JAVA架构师之路十五:设计模式之策略模式

JAVA架构师之路十四&#xff1a;设计模式之模板模式 策略模式 1. 策略模式2. 优惠券案例3. 支付案例 人生的游戏不在于拿了一副好牌&#xff0c;而在于怎样去打好坏牌&#xff0c;世上没有常胜将军&#xff0c;勇于超越自我者才能得到最后的奖杯。 1. 策略模式 定义 策略模式…

走向Java架构师之路:成为架构师要掌握的8大能力

架构师是什么?是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。 如何才能达到Java架构师技术要求标准?Java架构师需要熟练…