打家劫舍Ⅰ、Ⅱ、Ⅲ
动态规划的关键是:找出子问题,子问题可以通过子问题求解出来
动态规划的的四个解题步骤是:
1)定义子问题
2)写出子问题的递推关系
3)找出边界关系
4)空间优化(可选)
1 打家劫舍
- 题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 - 思路
1)子问题:原来的问题是“从全部房子中能偷到的最大金额”,将问题的规模缩小,子问题就是“从 k个房子中能偷到的最大金额”,用 f(k)表示。
2)子问题的递推关系:
有n个房子,每个房子的金额分别是nums[0]、nums[1]、…、nums[n-1],
子问题就是“从 k个房子中能偷到的最大金额”f(k)。
有两种偷法:一是偷第k个房子nums[k-1],那么问题就变成在前 k-2个房子中偷到的最大的金额。二是不偷第k个房子,问题就变成在前 k-1个房子中偷到最大的金额,也就是子问题f(k−1)。两种方法选择金额较大的一种结果。
递推关系是:f(k)=max(f(k-2)+nums[k-1],f(k-1))//数组下标从0开始
找出边界:第0个房子时,f(0)=0;第一个房子时f(1)=nums[0]
3)找出计算顺序:(代码的实现)只需要按 k 从小到大依次计算子问题即可。
4)空间优化
修改:
- 代码
2 打家劫舍Ⅱ
- 房屋围成一圈
- 代码
打家劫舍3
-
题目
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。
除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
-
思路
本题可分为两种情况,当前节点的值是偷还是不偷,所以我们用一个数组来表示,数组的第一位是偷,数组的第二位是不偷。并且本题我们采用从下向上进行访问。当前节点不存在时,则返回[0, 0],当存在时,则进行左节点和右节点的递归。
1)房屋是树形结构,采用何种方式遍历遍历呢?由于要知道当前节点的最大金额,我们需要知道其左右子节点的最大金额,因此左右子节点要先遍历,中间节点后遍历,故采用后序遍历
2)后序遍历使用递归- 递归的返回值?返回该节点的偷与不偷两种金额结果,用长度为2的数组保存,[偷的金额,不偷的金额]
- 递归结束条件?当遍历到空节点,返回[0,0]
- 单层递归的逻辑?分两种情况
** 偷当前节点获得的最大金额 = 左节点两个孩子节点的最大金额 + 右节点两个孩子节点的最大金额
** 不偷当前节点的最大金额 = 左节点的最大金额(偷与不偷取最大的) + 右节点的最大金额(偷与不偷取最大的)
-
代码
__EOF__

本文作者:衣囧~
本文链接:https://www.cnblogs.com/user-yi/p/16720998.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/user-yi/p/16720998.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律