You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

思路:开始写了个递归超时了。反应了好久才反应过来要用动态规划。

递归代码:

int rob(vector<int> &num) {
return robsub(num, , num.size());
}
int robsub(vector<int> &num, int s, int e)
{
if(s == e) return ;
if(e - s == ) return num[s];
return max(robsub(num, s + , e), num[s] + ((e - s >= ) ? robsub(num, s + , e) : ));
}

动态规划:

int rob2(vector<int> &num) {
vector<int> dp(num.size() + , ); //截止到num[i] - 1时的最大值
int ans = ;
for(int i = ; i <= num.size(); i++)
{
dp[i] = num[i - ] + max(((i - ) >= ? dp[i - ] : ), ((i - ) >= ? dp[i - ] : ));
ans = (ans > dp[i]) ? ans : dp[i];
}
return ans;
}

我的动态规划代码用的空间太多了,其实只要两个变量记录一下前面的就好。

public class Solution {
public int rob(int[] num) {
int i = ;
int e = ;
for (int k = ; k<num.length; k++) {
int tmp = i;
i = num[k] + e;
e = Math.max(tmp, e);
}
return Math.max(i,e);
}
}

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

思路:

时隔一个月做2,结果还是写递归。又是反应好久才想起来是动态规划。失败啊....

连成一个圈了,我们可以把问题分解为从房屋0到n-2和房屋1到n-1两个部分。

最优代码,dp,节约空间

int rob2(vector<int>& nums) {
if(nums.empty()) return ;
if(nums.size() == ) return nums[];
int maxMoney = ;
int pre = , cur = ;
//抢第一间房屋 不抢最后一间房屋的情况
for(int i = ; i < nums.size() - ; ++i)
{
int tmp = cur;
cur = nums[i] + pre;
pre = max(tmp, pre); //取前一个值和前前一个值中较大的
}
maxMoney = max(cur, pre);
//不抢第一间房屋 抢最后一间的情况
cur = pre = ;
for(int i = ; i < nums.size(); ++i)
{
int tmp = cur;
cur = nums[i] + pre;
pre = max(tmp, pre);
}
maxMoney = max(maxMoney, max(cur, pre));
return maxMoney;
}

次优代码,dp, 数组存储

int rob(vector<int>& nums) {
if(nums.empty()) return ;
if(nums.size() == ) return nums[];
int maxMoney = ;
vector<int> dp1(nums.size(), );
vector<int> dp2(nums.size(), );
//抢第一间房屋的情况
for(int i = ; i < nums.size() - ; ++i)
{
dp1[i] = nums[i] + max((i - >= ) ? dp1[i - ] : , (i - >= ) ? dp1[i - ] : );
maxMoney = (dp1[i] > maxMoney) ? dp1[i] : maxMoney;
}
//不抢第一间房屋的情况
for(int i = ; i < nums.size(); ++i)
{
dp2[i] = nums[i] + max((i - >= ) ? dp2[i - ] : , (i - >= ) ? dp2[i - ] : );
maxMoney = (dp2[i] > maxMoney) ? dp2[i] : maxMoney;
}
return maxMoney;
}

最烂的递归代码,超时。

//递归 超时
int rob1(vector<int>& nums) {
if(nums.empty()) return ;
int maxMoney = ;
int curMoney = ;
recursion(maxMoney, curMoney, , nums, false);
curMoney = nums[];
recursion(maxMoney, curMoney, , nums, true);
return maxMoney;
} void recursion(int &maxMoney, int &curMoney, int id, vector<int>& nums, bool isFirstUsed)
{
if(id >= nums.size())
{
maxMoney = (curMoney > maxMoney) ? curMoney : maxMoney;
}
else if(id == nums.size() - && isFirstUsed) //当前是最后一个屋子 但第一个屋子抢过
{
recursion(maxMoney, curMoney, id + , nums, isFirstUsed); //不抢当前房屋
}
else
{
int money = nums[id];
recursion(maxMoney, curMoney, id + , nums, isFirstUsed); //不抢当前房屋
curMoney += money; //抢当前房屋
recursion(maxMoney, curMoney, id + , nums, isFirstUsed);
curMoney -= money;
}
}

【leetcode】House Robber & House Robber II(middle)的更多相关文章

  1. 【leetcode】Pascal's Triangle I & II (middle)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  2. 【leetcode】Binary Tree Right Side View(middle)

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  3. 【leetcode】Bitwise AND of Numbers Range(middle)

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  4. 【leetcode】Longest Substring Without Repeating Characters (middle)

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  5. 【LeetCode】385. Mini Parser 解题报告(Python)

    [LeetCode]385. Mini Parser 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/mini-parser/ ...

  6. 【LeetCode】376. Wiggle Subsequence 解题报告(Python)

    [LeetCode]376. Wiggle Subsequence 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.c ...

  7. 【LeetCode】649. Dota2 Senate 解题报告(Python)

    [LeetCode]649. Dota2 Senate 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地 ...

  8. 【LeetCode】911. Online Election 解题报告(Python)

    [LeetCode]911. Online Election 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ ...

  9. 【LeetCode】886. Possible Bipartition 解题报告(Python)

    [LeetCode]886. Possible Bipartition 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...

  10. 【LeetCode】36. Valid Sudoku 解题报告(Python)

    [LeetCode]36. Valid Sudoku 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址 ...

随机推荐

  1. CSS-animations和transitions性能:浏览器到底做了什么?

    CSS animations 和 transitions 的性能:浏览器到底做了什么?(译) 原文地址:http://blogs.adobe.com/webplatform/2014/03/18/cs ...

  2. [译]Probable C# 6.0 features illustrated

    原文: http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated ========================= ...

  3. 基础知识系列☞各版本下IIS请求处理过程区别

    转载地址→http://www.cnblogs.com/fsjohnhuang/articles/2332074.html ASP.NET是一个非常强大的构建Web应用的平台, 它提供了极大的灵活性和 ...

  4. 控制器View的生命周期及相关函数是什么?你在开发中是如何用的?

    * 1.首先判断控制器是否有视图,如果没有就调用loadView方法创建:通过storyboard或者代码: * 2.随后调用viewDidLoad,可以进行下一步的初始化操作:只会被调用一次: * ...

  5. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  6. 修改Ubuntu12.04 左侧启动器Launcher图标大小,以及如何隐藏启动器?

    在 VirtualBox 中安装了 Ubuntu 12,一直使用 2D 桌面,3D桌面没用上,估计是电脑配置低的问题. 左边启动器的图标特别大,占据了很多的桌面空间,打算调小点.奇怪的是,在“系统设置 ...

  7. 用hexo书写github.io博客 学习心得 教程

    很久没更新文章了,除了工作忙之外,可能就是自己懒惰了. 最近混迹与github,发现git上写博客也是个很不错的平台. 推荐使用 hexo 模版来书写,毕竟我们重点是写文章,而不是管理,所以有神奇何妨 ...

  8. CMake Error: your CXX compiler: "" was not found

    [root@amax src]# cmake . -- The CXX compiler identification is unknown CMake Error at /usr/local/sha ...

  9. 在Fedora 20 上安装Mysql并初始化root密码

    [root@localhost ~]# yum -y install community-mysql-server #安装数据库 已加载插件:langpacks, refresh-packagekit ...

  10. C# 属性和索引

    //用索引取一个记录中的各项 using system; class IndexerRecord{ private string[] data= new string [6]; private str ...