"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;
	}
};
写完代码回过头来看,发现其实还是动态规划的问题,只不过数据结构从数组变成了树。


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

337. House Robber III

The thief has found himself a new place for his thievery again. There is only one entrance to this a...

House Robber III

c++/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *l...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

LeetCode 337. House Robber III

大概题意:给定一棵二叉树,每个节点都有一个值,要求从其中选取若干个节点,是的值的和最大,约束条件为任意两个选取的节点之间不能相连。           解题的思路也很清晰,我们可以用动态规划的做法,...

leetcode 337:House Robber III

leetcode 337:House Robber III。leetcode新题,递归的动态规划

leetcode_middle_31_337. House Robber III

分析: 找出二叉树中最大的不相邻结点的值的和 题意: 一开始的想法是用一个布尔型参数确定下一个结点的值取不取,想的是就两种情况,一层取,下一层就不去...: private void h...

LeetCode - 337. House Robber III

这道题目具有Binary Tree的结构并且拥有最优子结构这一性质,也就是说如果我们想从当前的root抢劫到最多的钱,那么我们也希望在root的left和right子树上面抢到最多的钱。题目中已经给出...

leetcode笔记:House Robber III

题目的意思是,小偷找到了一个新的偷盗场所。这片区域只有一个入口,叫做“根”。除了根以外,每个屋子有且仅有一个父屋子。在踩点之后盗贼发现,所有的房间构造形成了一棵二叉树。如果两个直接相连的屋子在同时被盗...

[Leetcode] 337. House Robber III 解题报告

题目: The thief has found himself a new place for his thievery again. There is only one entrance ...

LeetCode337. House Robber III

题目: https://leetcode.com/problems/house-robber-iii/ The thief has found himself a new place for hi...

337 leetcode House Robber III

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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