| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LeetCode·337.打家劫舍 ||| · 树形dp -> 正文阅读 |
|
[数据结构与算法]LeetCode·337.打家劫舍 ||| · 树形dp |
链接:https://leetcode.cn/problems/house-robber-iii/solution/by-xun-ge-v-x6f0/ 题目? 示例? 思路
以下数组我们直接用结构体代替 这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。 所以dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。 所以本题dp数组就是一个长度为2的数组! 那么有同学可能疑惑,长度为2的数组怎么标记树中每个节点的状态呢? 别忘了在递归的过程中,系统栈会保存每一层递归的参数。 如果还不理解的话,就接着往下看,看到代码就理解了哈。
在遍历的过程中,如果遇到空间点的话,很明显,无论偷还是不偷都是0,所以就返回 if (cur == NULL) return {0, 0};
首先明确的是使用后序遍历。因为通过递归函数的返回值来做下一步计算。
代码如下: // 下标0:不偷,下标1:偷
如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (如果对下标含义不理解就在回顾一下dp数组的含义) 如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]); 最后当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱} 代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:28:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |