"House Robber" and "House Robber III"

原创 2016年05月31日 11:00:34

House Robber:

nums为{3, 2, 1, 5},那么dp[0]=3,dp[1]=3,得到递推公式dp[i] = max(num[i] + dp[i - 2], dp[i - 1]), 代码如下:

class Solution {
public:
    int rob(vector<int> &num) {
        if (num.size() <= 1) return num.empty() ? 0 : num[0];
        vector<int> dp = {num[0], max(num[0], num[1])};
        for (int i = 2; i < num.size(); ++i) {
            dp.push_back(max(num[i] + dp[i - 2], dp[i - 1]));//递推公式
        }
        return dp.back();
    }
};

House Robber III:

和上一个题的思路完全不一样,曾经被带偏去用广搜求树的每一层的和组成数组,然后像上面的题一样用动态规划。。。

这道题用深度优先搜索来解决。对于当前节点,只有盗窃和不盗窃两种操作,这取决于当前节点的子节点的状态,可用两个变量表示:not和yes:
not:当前节点(屋子)不偷盗时,所能获得的收益;取决于在该节点的两个子节点被偷盗时的收益之和。
yes:当前节点(屋子)偷盗时,所能获得的收益;由于相邻节点不能同时偷盗否则会引来警察,所以两个子节点不能偷盗,此时收益等于:父节点->val + 左子节点->not+ 右子节点->not。
比较两种收益not和yes,取较大者作为当前节点的最大收益。

class Solution {
public:
	struct Money {
		int not;  // 该节点不偷,收益为子节点偷的情况下的收益和
		int yes; // 该节点处偷,加上两子节点不偷时的收益
		Money() :not(0), yes(0) {}
	};

	int rob(TreeNode* root) {
		Money sum = dfs(root);
		return sum.yes;
	}

	Money dfs(TreeNode* root)
	{
		if (root == NULL) return Money();
		Money leftMoney = dfs(root->left);   // 当前节点的左子节点收益情况
		Money rightMoney = dfs(root->right); // 当前节点的右子节点收益情况
		Money sumMoney;
		sumMoney.not = leftMoney.yes + rightMoney.yes; // 当前节点不偷
		sumMoney.yes = max(sumMoney.not, root->val + leftMoney.not + rightMoney.not);
		return sumMoney;
	}
};
写完代码回过头来看,发现其实还是动态规划的问题,只不过数据结构从数组变成了树。


【LeetCode-面试算法经典-Java实现】【198-House Robber(抢劫犯)】

【189-House Robber(抢劫犯)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-Chao】原题  Y...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月25日 06:41
  • 3585

Xcode 6.1 做ipa企业级分发(In-House模式)详细步骤

新版的xcode(6.1)在导出企业级ipa时并没有“saved for enterprise distribution”这个选项,所以需要手动添加该plist文件。...
  • pang040328
  • pang040328
  • 2014年11月08日 22:50
  • 43765

iOS企业版证书($299)In-House方式发布指南

iOS企业版证书($299)In-House方式发布指南 我们需要发布一个ipa放到网上,所有人(包括越狱及非越狱设备)可以直接通过链接下载安装,不需要通过AppStore,也不需要安装任何证书...
  • u011961093
  • u011961093
  • 2015年10月22日 18:42
  • 1097

LeetCode #337 - House Robber III - Medium

ProblemThe thief has found himself a new place for his thievery again. There is only one entrance to...
  • Arcome
  • Arcome
  • 2016年11月09日 18:54
  • 172

LeetCode:House Robber III

House Robber III Total Accepted: 13977 Total Submissions: 37027 Difficulty: Medium ...
  • itismelzp
  • itismelzp
  • 2016年06月10日 14:01
  • 1421

Uber面试题2 | House Robber III

题目描述  小偷找到了一个新的偷盗地点,这里地区的房子组成了一棵二叉树,地区的入口是二叉树的根所在的房子。如果小偷同时偷窃了两个直接相邻的房子,就会触发警报器。求在不触发警报器的情况下小偷可以抢...
  • wangmanjie
  • wangmanjie
  • 2016年05月04日 16:48
  • 549

leetcode之 House Robber III

这次是强盗的第3篇。偷盗对象是颗二叉树,要求找到最大的利益。从给的例子来看,很容易就会看到最简单的动态规划算法。class Solution(object): def rob(self, ro...
  • howtogetout
  • howtogetout
  • 2016年06月23日 23:14
  • 196

[leetcode]337. House Robber III

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • u010112493
  • u010112493
  • 2016年05月06日 22:26
  • 173

337_house_robber_III

LeetCode 337 House Robber III问题描述求树中不相邻元素的最大和。 The thief has found himself a new place for his thi...
  • lilingyu520
  • lilingyu520
  • 2016年05月15日 19:38
  • 488

LeetCode House Robber III

The thief has found himself a new place for his thievery again. There is only one entrance to this a...
  • clx44551
  • clx44551
  • 2016年03月18日 23:53
  • 282
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:"House Robber" and "House Robber III"
举报原因:
原因补充:

(最多只允许输入30个字)