动态规划2:“打家劫舍”类问题

前言

后面的部分都是我本人的一些刷题的笔记,题目可能存在其他解法,可能比动态规划更加地高效,但我本人的重点会放在如何用动态规划解决这个问题,以及如何进行优化,使得时间复杂度和空间复杂度能够进一步地下降。

回顾动态规划的解题步骤

利用动态规划解题的基本步骤:

  1. 定义状态,确认最优原则可以解决这个问题(一般很显然)
  2. 确定动态规划递归方程
  3. 按动态规划递归方程进行迭代,再进行回溯

一般直接暴力迭代的方法并不优于暴力求解,原因是存在大量的重复计算,一般我们需要将结果保存起来,以避免重复计算,这样就可以大大优化时间复杂度。

本期题目
198:打家劫舍
213:打家劫舍II
740:删除并获得点数

198.打家劫舍

题目描述见链接:198:打家劫舍,这里不再赘述。我们直接来求解这个问题。

这道题的本质是:从正整数数组中调出一个组合,这个组合的两个数都两两不相邻,如何使得这几个数的和最大,因此,我们可以从第一个数到最后一个数,决定是否加入到组合当中。

如果进入第一件房子: 可以获得的收益是nums[0],剩下可以进入的房子下标从2到n-1,设从下标2到n-1房子可以获得的最大收益为 V 2 V_2 V2

如果不进入第一件房子: 可以获得的最大收益是进入下标1到n-1的房子可以获得的最大收益,设为 V 1 V_1 V1

动态规划递归方程: 设进入0到n-1号房子可以获得的最大收益为V_0,动态规划递归方程为 V 0 = m a x ( n u m s [ 0 ] + V 2 , V 1 ) V_0=max(nums[0]+V_2,V_1) V0=max(nums[0]+V2,V1)

设打劫i到n-1号房子可以获得的最大收益为 V i V_i Vi,那么,就有
V i = { max ⁡ ( n u m s [ i ] + V i + 2 , V i + 1 ) 0 ≤ i ≤ n − 3 max ⁡ ( n u m s [ i ] , n u m s [ i + 1 ] ) i = n − 2 n u m s [ n − 1 ] i = n − 1 V_i=\begin{cases} \max(nums[i]+V_{i+2},V_{i+1})&0\leq i\leq n-3\\\\ \max(nums[i],nums[i+1])&i=n-2\\\\ nums[n-1]&i=n-1 \end{cases} Vi=max(nums[i]+V

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值