"House Robber" and "House Robber III"
2016-05-31 11:00
253 查看
House Robber:
nums为{3, 2, 1, 5},那么dp[0]=3,dp[1]=3,得到递推公式dp[i] = max(num[i] + dp[i - 2], dp[i - 1]), 代码如下:
House Robber III:
和上一个题的思路完全不一样,曾经被带偏去用广搜求树的每一层的和组成数组,然后像上面的题一样用动态规划。。。
这道题用深度优先搜索来解决。对于当前节点,只有盗窃和不盗窃两种操作,这取决于当前节点的子节点的状态,可用两个变量表示:not和yes:
not:当前节点(屋子)不偷盗时,所能获得的收益;取决于在该节点的两个子节点被偷盗时的收益之和。
yes:当前节点(屋子)偷盗时,所能获得的收益;由于相邻节点不能同时偷盗否则会引来警察,所以两个子节点不能偷盗,此时收益等于:父节点->val + 左子节点->not+ 右子节点->not。
比较两种收益not和yes,取较大者作为当前节点的最大收益。
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; } };写完代码回过头来看,发现其实还是动态规划的问题,只不过数据结构从数组变成了树。
相关文章推荐
- getHibernateTemplate用法
- 快消行业如何营销?
- STL运用的C++技术(5)——重载操作符
- iOS 支持 IPv6
- sqlserver 创建用户 sp_addlogin
- 为什么有人不喜欢标准成本?
- 2016-5-30 代码Review问题总结
- 【Android基础】二、网络编程
- 如何在JSP页面中设置断点,调试代码?
- Bootstrap时间控件 datetimepicker
- STL运用的C++技术(4)——重载函数
- docker相关
- 好玩的前端技术开发,给你刺激
- SDUTOJ1755 装备合成(dfs序+线段树)
- struts2 拦截器,使用spring注入
- 7Z命令行详解
- 基于select的服务端
- 《挑战程序设计竞赛》 读后感
- STL运用的C++技术(3)——模板实参推断
- win8.1系统开机屏幕总是会闪一下或黑屏一会才进入桌面的故障原因及解决方法