借鉴DP思想: HouseRobberIII
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
3
/ \
2 3
\ \
3 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
题目大意
给定一二叉树,树节点上有权值,从树中选取一些不直接相邻的节点,使得节点和最大
思考过程
1. 简单粗暴,搜索完事,一个节点不外乎两种情况,选择 or 不选择;另外当前节点选择之后,子节点不能被选择;当前节点若不选择,则又可以分为四种情况
* 左选择,右不选
* 右选,左不选
* 左右都选
* 左右都不选
2. 写代码,好的然而超时(当然-_-后来看了其他的解答,才发现too young)
3. 因为看到有重复计算,于是朝动态规划考虑,于是想出这么个状态
d[0][1],其中0表示存储遍历到当前节点时,取当前节点能达到的最大值,而1则表示,不取当前节点能达到的最大值
又因为是树节点,所以直接哈希表存储d[TreeNode*][]
4. 遍历顺序呢,习惯性后序遍历
5. 计算规则
// 显然,当前节点取了,子节点不能取
d[TreeNode*][0] = TreeNodeVal + d[LeftChild][1] + d[RightChild][1]
// 四种情况
d[TreeNode*][1] = max(d[LeftChild][0] + d[RightChild][0], d[LeftChild][1] + d[RightChild][0], d[LeftChild][0] + d[RightChild][1], d[LeftChild][1] + d[RightChild][1])
6. 总算过了,附代码;看了讨论的思路之后,觉得真是too young,╮(╯▽╰)╭
class Solution {
public:
int rob(TreeNode* root) {
if (root == NULL) {
return ;
}
postOrder(root);
return max(d[root][], d[root][]);
}
void postOrder(TreeNode* itr) {
if (itr == NULL) {
return;
}
postOrder(itr->left);
postOrder(itr->right);
auto dItr = d.insert(pair<TreeNode*, vector<int>>(itr, vector<int>(, )));
auto leftItr = dItr.first->first->left;
auto rightItr = dItr.first->first->right;
int rL = dItr.first->first->left != NULL ? d[dItr.first->first->left][] : ;
int rR = dItr.first->first->right != NULL ? d[dItr.first->first->right][] : ;
int uL = dItr.first->first->left != NULL ? d[dItr.first->first->left][] : ;
int uR = dItr.first->first->right != NULL ? d[dItr.first->first->right][] : ;
dItr.first->second[] = dItr.first->first->val + uL + uR;
dItr.first->second[] = max(max(max(rL + uR, uL + rR), rL + rR), uL + uR);
}
private:
unordered_map<TreeNode*, vector<int>> d;
};
借鉴DP思想: HouseRobberIII的更多相关文章
- 到底什么是dp思想(内含大量经典例题,附带详细解析)
期末了,通过写博客的方式复习一下dp,把自己理解的dp思想通过样例全部说出来 说说我所理解的dp思想 dp一般用于解决多阶段决策问题,即每个阶段都要做一个决策,全部的决策是一个决策序列,要你求一个 最 ...
- hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)
Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- DP思想在斐波那契数列递归求解中的应用
斐波那契数列:1, 1, 2, 3, 5, 8, 13,...,即 f(n) = f(n-1) + f(n-2). 求第n个数的值. 方法一:迭代 public static int iterativ ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- DP思想笔记
一.思想 DP也是把复杂的问题分解为许多子问题,与分治法不同的是,分治法的各个子问题互相之间没有联系,而动态规划却有.前一个子问题的结果与下一步的子问题的结果是什么有关系.这就决定了DP算法肯定有一个 ...
- 借鉴Glide思想二次封装Fresco
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近封装了个 Fresco 的组件库:DFresco,就顺便来讲讲. 背景 Fresco 图片库很强大,我们项目中就是使用的 Fre ...
- CodeForces5E 环转链,dp思想
http://codeforces.com/problemset/problem/5/E 众所周知,在很久以前,在今天的 Berland 地区,居住着 Bindian 部落.他们的首都被 n 座山所环 ...
- DAG上dp思想
DAG上DP的思想 在下最近刷了几道DAG图上dp的题目.要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点.第二道是洛谷上的NOI导刊题 ...
- 滑雪(经典DP思想)
个人心得:思想还是不够,开始自己写但是不知道如何记录长度,也不太知道状态的转移,后面看了百度, 发现人人为我我为人人就是一步一步推导, 而递归思想就要求学会记录和找到边界条件,这一题中的话就是用递归, ...
随机推荐
- Flas-SQLAchemy数据库操作使用学习笔记
Flas-SQLAchemy数据库操作使用学习笔记 Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展.SQLALchemy 是Python语言的S ...
- uboot启动后在内存中运行裸机程序hello
如题,实现过程中发现3额问题,先写下来,待解答: 1.uboot启动后再dnw上打印许多信息,我想改变其中的打印信息或加上自己的打印信息以证明程序运行到何处.修改完后重新编译uboot.bin. 在D ...
- 使用cocoapods导入第三方后 报错_OBJC_CLASS_$_XXX
我们手动导入第三方库的时候,感觉管理不是很方便,于是会选择使用Cocoapods管理.现在记录一下使用心得,当使用cocoapods导入afnetworking或者其他框架的时候,发现调用的时候总是报 ...
- [Android Webkit]JNI基础及Java层与C++层的交互
1. JNI 注册 1.1. JNI的基础结构 JAVA == JNI == Native Code JNI(Java Native Interface)是Java与Native ...
- Cocos2d-x 3.x 头像选择,本地相册图片+图片编辑(Android、IOS双平台)
大连游戏产业不是很发达,最后,选择一个应用程序外包公司.积累的工作和学习过程中的一点业余生活微信体验,我想分享的游戏小朋友的爱. 在应用开发过程中会经常实用户上传头像的功能,在网上找了N多资料发现没有 ...
- html 第一阶段 学习使用总结
基本使用内容: <html> <head> <title>Title of the document</title> <link rel=&quo ...
- Linux 所有命令都用不了,只有cd exit能用
原因: 在设置 java环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.在命令行下打入下面这段就可以了export PATH=/usr/local/sbin:/us ...
- 如何动态修改grid的列名
有这样的需求,搜索时候会选择搜索类型,每种搜索类型展示的列名不一样 如何动态修改grid的列名 效果图:点击bColumn页面切换成bColumn 实现思路:通过grid的reconfigure方法, ...
- 全世界最详细的一步一步搭建RAC步骤(一)---安装操作系统RHEL4.6【weber出品】
全文搭建RAC分为3步骤 <--安装操作系统RHEL4.6> <--配置ASM+裸设备> <--安装集群软件> <--安装数据库软件> ...
- Objective-C学习篇10—NSDate与NSDateFormatter
NSDate NSDate 时间类,继承自NSObject,其对象表示一个时间点 NSDate *date = [NSDate date]; NSLog(@"date = %@", ...