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. 黑客攻防技术宝典Web实战篇(三)web攻击方式总结

    web攻击的手段无非就是使服务器资源耗尽,使服务器无法接收正常请求. 一.DDos攻击 二.DRDos攻击 三.慢攻击 与Ddos攻击相反,慢攻击并不是以多取胜,而是靠保持连接.

  2. [译]git config

    git config git config命令用来设置git的一些配置(包括全局配置和针对单个仓储的配置).git config命令能定义一个仓储的用户信息和用户偏好. 用法 git config u ...

  3. spark

    http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool spark presto2.0计算引擎 http://blog ...

  4. maven 向本地私库导入jar

    mvn install:install-file -DgroupId=<your_group_name> -DartifactId=<your_artifact_name> - ...

  5. BZOJ2243——[SDOI2011]染色

    1.题目大意:给个树,然后树上每个点都有颜色,然后会有路径的修改,有个询问,询问一条路径上的颜色分成了几段 2.分析:首先这个修改是树剖可以做的,对吧,但是这个分成了几段怎么搞呢,我们的树剖的不是要建 ...

  6. Android学习笔记(八)——四种基本布局

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,或是嵌套子布局,从而编写出精美的界 ...

  7. word20161201

    http://baike.baidu.com/link?url=ZTTkA-suMlJNGb2AeNBE2E6MZQZwjkvWXKgmUpeLBIrCfC-k32cGJOJLrtDlLXjsTfkD ...

  8. tomcat管理端的页面安全措施

    由于公司的项目并未启用nginx负载均衡,所以自然也没用到tomcat与web应用一对一的安全操作,经常会遇到 重启单个应用又不想重启tomcat的情况.同时,又出于安全考虑,将tomcat的默认管理 ...

  9. php源码安全加密之PHP混淆算法.

    php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧.PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法.一\PHP的加密总 ...

  10. Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.

    转载:http://www.raysoftware.cn/?p=518&utm_source=tuicool 恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的 ...