打劫房屋 III-LintCode
2017-11-04 12:19
246 查看
在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树。与前两次偷窃相似的是每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻的两个房子同一天被打劫时,该系统会自动报警。
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
样例:
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.
窃贼最多能偷窃的金钱数是 4 + 5 = 9.
思路:
修改二叉树每个节点的值,返回根节点值为最后结果。
对于如下矩阵
a->val=max(b+c,d+e+f+g)
用此方法遍历每个节点,得到最终结果。
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
样例:
3 / \ 2 3 \ \ 3 1
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.
3 / \ 4 5 / \ \ 1 3 1
窃贼最多能偷窃的金钱数是 4 + 5 = 9.
思路:
修改二叉树每个节点的值,返回根节点值为最后结果。
对于如下矩阵
a / \ b c / \ /\ d e f g
a->val=max(b+c,d+e+f+g)
用此方法遍历每个节点,得到最终结果。
#ifndef C535_H #define C535_H #include<iostream> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int val) { this->val = val; this->left = this->right = NULL; } }; class Solution { public: /* * @param root: The root of binary tree. * @return: The maximum amount of money you can rob tonight */ int houseRobber3(TreeNode * root) { // write your code here if (root == NULL) return 0; int a = houseRobber3(root->left); int b = houseRobber3(root->right); int num1 = 0; int num2 = 0; int num3 = 0; int num4 = 0; if (root->left != NULL) { if (root->left->left != NULL) num1 = root->left->left->val; if (root->left->right != NULL) num2 = root->left->right->val; } if (root->right != NULL) { if (root->right->left != NULL) num3 = root->right->left->val; if (root->right->right != NULL) num4 = root->right->right->val; } root->val = maxVal(a + b, num1 + num2 + num3 + num4 + root->val); return root->val; } int maxVal(int a, int b) { return a > b ? a : b; } }; #endif
相关文章推荐
- LintCode:打劫房屋 III
- LintCode 打劫房屋 I II III
- **[Lintcode] House Rober III 打劫房屋 III
- lintcode:打劫房屋 III
- lintcode--打劫房屋
- 打劫房屋 II和打劫房屋 III
- 打劫房屋 III
- lintcode---打劫房屋I 打劫房屋II
- 打劫房屋III
- lintcode(534)打劫房屋 II
- LintCode(M)打劫房屋(动态规划)
- lintcode-392-打劫房屋
- 打劫房屋 II-LintCode
- LintCode(M)打劫房屋2——动态规划
- *[Lintcode]House Robber 打劫房屋
- 【LintCode】打劫房屋
- lintcode打劫房屋
- [Lintcode] #392 打劫房屋
- lintcode-打劫房屋
- 打劫房屋-LintCode