要了解DP,需要知道递归的知识和基本的暴力搜索。
定义:
- 本质:递归
- 原问题(N)->子问题(N-1)->原问题(N)
最优子结构
- 子问题最优决策可导出原问题最优决策
- 无后效性
重叠子问题
- 去冗余
- 空间换时间(注意分析时空复杂度)
基本步骤:
四个步骤
- 设计暴力算法,找到冗余
- 设计并存储状态(一维,二维,三维数组,甚至用Map)
- 递归式(状态转移方程)
- 自底向上计算最优解(编程方式)
从实例出发,记录下思路,题目
简述一下题意:
一排房子,每户人家都有钱,你抢的目标不能是相连的两家,否则会触发警报器,问题 在不触发警报器的情况下,如何抢到最多的钱?
假设nums数组用来存储每户人家的钱,那么现在来思考,我到了第n家,我有两个选择,是抢或者不抢
选择抢劫第n家—>那么抢劫犯收益 需要加上nums[n],而且剩下的抢劫对象只能是n-2,n-3…..其中一家了(抢劫对象不能相邻)
选择不抢劫第n家-–> 那么 走过了就不能回头抢了,所以他的抢劫对象只能是n-1个家其中一个,并且没有任何收益(因为他走到第n家的时候,门都没进去,怎么抢,不抢就没钱咯)
代码:
<