算法-打劫房屋III(深搜)

今天做了一道关于二叉树的题,之所以要记录下,这个题的解法真是太巧妙了

题意:

在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的
地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现
这次的地形是一颗二叉树。与前两次偷窃相似的是每个房子都存放着特定金额的
钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻
的两个房子同一天被打劫时,该系统会自动报警。

算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情
况下。

样例:

  3
 / 2   3
 \   \
  3   1
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.

    3
   /   4   5
 / \   \
1   3   1
窃贼最多能偷窃的金钱数是 4 + 5 = 9.

我们先贴代码,再来看看这个题巧妙在哪里:

 1     public int houseRobber3(TreeNode root) {
 2
 3         int[] result = postTraver(root);
 4         return Math.max(result[0], result[1]);
 5     }
 6     private int[] postTraver(TreeNode root){
 7         if(root == null){
 8             return new int[]{0,0};
 9         }
10         int result[] = new int[2];
11         int []left = postTraver(root.left);
12         int []right = postTraver(root.right);
13
14         //0表示偷当前的节点,1表示不偷当前的节点
15         //表示偷当前节点,因此两个孩子不能偷
16         result[0] = left[1] + right[1] + root.val;
17
18         //表示不偷当前的节点,因此可以偷两个孩子
19         result[1] = Math.max(left[0], left[1]) + Math.max(right[0], left[1]);
20
21         return result;
22     }

看了代码,我们发现这个题的解法真是巧妙,开辟两个长度的int数组,其中0表示要偷当前的节点,1表示不偷当前的节点。当要偷当前的节点时,两个孩子肯定不偷,因此两个孩子取1,当不偷当前的节点时,这个看情况,可以偷孩子,也可以不偷孩子的,因此需要求最大值。

时间: 2024-07-28 13:15:39

算法-打劫房屋III(深搜)的相关文章

LintCode刷题——打劫房屋I、II、III

打劫房屋I: 题目内容: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警.给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下. 样例: 给定 [3, 8, 4], 返回 8. 挑战: O(n) 时间复杂度 且 O(1) 存储. 算法分析: 前提:对于某一间房子i,如果盗贼要打劫该房子,则房

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

hdu 5311 Hidden String dp o(n)算法 深搜

Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 857    Accepted Submission(s): 322 Problem Description Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets

HDU ACM 1142 A Walk Through the Forest->SPFA算法+记忆化深搜

分析:找到吉米从办公室穿过森林回到家(也就是从点1到点2)的最短路径有多少条,其中要满足如果要走A到B这条路,那么就有从A到终点的距离都大于B到终点的距离. 解法:spfa算法+记忆化深搜 1.spfa求出从终点2到其他所有点的最短路 2.记忆化DFS从1开始向其他点深搜,最后结果就是dp[1]. #include<iostream> #include<queue> using namespace std; int u[2000002]; int v[2000002]; int w

算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序訪问"图"中全部的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现. 广度优先(优先走近期的).用的数据结构是队列.主要是迭代实现. 对于深搜.因为递归往往能够方便的利用系统栈,不须要自己维护栈.所以通常实

【算法总结】深搜

算法总结-深搜 由于是深度优先,后进入的结点需要先读取,因此选取堆栈实现,在栈中保存从起始结点(状态)到当前结点的路径上的所有结点.一般用递归实现. 非递归框架 DFS() { 初始化栈 while (栈不为空 & 未找到目标结点) { 取栈顶元素扩展,扩展出的结点放回栈顶 } ...... } 递归框架 在深度优先搜索中,状态空间的图结构并不一定需要显式地保存下来. type node; void DFS(int depth) { for (node的每一个可行变化) { 改变node DFS

算法-图是否为树(并查集或深搜)

今天做了一道很有意思的一道题,这道题虽然难度只是中等,但是里面涉及到的东西却是不少.其中,我在里面学习到了并查集这个东西,虽然不是很深刻,至少有一个印象:还有深搜,一直以来,深搜和广搜都是我的弱项,本文的理解是基于别人的博客:lintcode178. graph valid tree 图是否是树.我们来看看题 题意: 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每 条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 样例: 给出n = 5 并

HDU1342 Lotto 【深搜】

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)

题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem  description In ICPCCamp, there are n cities and (n−1) (bidirectional) roads between cities. The i-th road is between the ai-th and bi-th cities. It is guaranteed that cities are conne