动态规划(Dynamic Programming)学习笔记记录

本文介绍了动态规划的概念,强调其与递归的关系,以及如何通过优化解决重叠子问题。通过一个实例——抢劫问题,详细阐述了动态规划的四个基本步骤,并给出代码实现,展示了如何使用备忘录技术避免冗余计算,从而提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要了解DP,需要知道递归的知识和基本的暴力搜索。

定义:

  • 本质:递归
  • 原问题(N)->子问题(N-1)->原问题(N)

最优子结构

  • 子问题最优决策可导出原问题最优决策
  • 无后效性

重叠子问题

  • 去冗余
  • 空间换时间(注意分析时空复杂度)

基本步骤:
四个步骤

  • 设计暴力算法,找到冗余
  • 设计并存储状态(一维,二维,三维数组,甚至用Map)
  • 递归式(状态转移方程)
  • 自底向上计算最优解(编程方式)

从实例出发,记录下思路,题目

简述一下题意:

一排房子,每户人家都有钱,你抢的目标不能是相连的两家,否则会触发警报器,问题 在不触发警报器的情况下,如何抢到最多的钱

假设nums数组用来存储每户人家的钱,那么现在来思考,我到了第n家,我有两个选择,是抢或者不抢
选择抢劫第n家—>那么抢劫犯收益 需要加上nums[n],而且剩下的抢劫对象只能是n-2,n-3…..其中一家了(抢劫对象不能相邻
选择不抢劫第n家-–> 那么 走过了就不能回头抢了,所以他的抢劫对象只能是n-1个家其中一个,并且没有任何收益(因为他走到第n家的时候,门都没进去,怎么抢,不抢就没钱咯)

代码:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值