题目

打劫房屋II

在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。

样例

给出nums = [3,6,4], 返回 6, 你不能打劫34所在的房间,因为它们围成一个圈,是相邻的.

解题

打劫房屋I

根据题目,第0个房间和第n-1个房间只能打劫其中一个

打劫范围只能是:0-n-2 或者1-n-1

所以根据打劫房间I的程序,修改为根据范围进行打劫,再求这个两个打劫的最大值。

下面程序定义的dp数组,dp[i]表示打劫当前房间能够获得最大值

最后的结果要返回最后两个值得最大值

public class Solution {
/**
* @param nums: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
public int houseRobber2(int[] nums) {
// write your code here
if(nums==null || nums.length == 0)
return 0;
if(nums.length == 1)
return nums[0];
if(nums.length == 2)
return Math.max(nums[0],nums[1]);
if(nums.length == 3)
return Math.max(Math.max(nums[0],nums[1]),nums[2]);
int len = nums.length;
int res1 = houseRobber(nums,0,len-2);
int res2 = houseRobber(nums,1,len-1);
return Math.max(res1,res2);
}
public int houseRobber(int[] nums,int start,int end){
if(start == end)
return nums[start];
if(start +1 == end){
return Math.max(nums[start],nums[end]);
}
if(start +2 == end){
return Math.max(nums[start]+nums[end],nums[start+1]);
}
int len = nums.length;
int[] dp = new int[len];// 打劫 第i个房间,所能够获得最大值
dp[start] = nums[start];
dp[start+1] = nums[start+1];
dp[start+2] = nums[start+2] + dp[start];
for(int s = start + 3;s<= end;s++){
dp[s] = nums[s] + Math.max(dp[s-3],dp[s-2]);
}
return Math.max(dp[end],dp[end-1]);
}
}

打劫房间I中下面定义的dp[i],表示打劫到第i个房间所能够获得0-i内的局部最大值

定义dp[i],表示当前所能获得的最大收获,这里的值最终就是最大值,数组dp的长度是len+1,第一个元素是0,dp[i]也可以理解为,不包含A[i]元素时所取得的最大值

dp[i] = Math.max(dp[i-1],dp[i-2]+A[i-1])

不是很理解

public class Solution {
/**
* @param nums: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
public int houseRobber2(int[] nums) {
// write your code here
if(nums==null || nums.length == 0)
return 0;
if(nums.length == 1)
return nums[0];
if(nums.length == 2)
return Math.max(nums[0],nums[1]);
if(nums.length == 3)
return Math.max(Math.max(nums[0],nums[1]),nums[2]);
int len = nums.length;
int res1 = houseRobber(nums,0,len-2);
int res2 = houseRobber(nums,1,len-1);
return Math.max(res1,res2);
}
public int houseRobber(int[] nums,int start,int end){ int len = nums.length;
int[] dp = new int[len+1];// 打劫 0-i之间的房间,所能够获得最大值
dp[start] = 0;
dp[start+1] = nums[start]; for(int s = start+2;s<=end+1;s++){
dp[s] = Math.max(dp[s-1],dp[s-2]+nums[s-1]);
}
return dp[end+1];
}
}
 

lintcode:打劫房屋II的更多相关文章

  1. 打劫房屋 · House Robber

    [抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...

  2. lintcode:打劫房屋 III

    题目 打劫房屋 III 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树.与前两次偷窃 ...

  3. lintcode:打劫房屋

    题目 打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动 ...

  4. Lintcode: Sort Colors II 解题报告

    Sort Colors II 原题链接: http://lintcode.com/zh-cn/problem/sort-colors-ii/# Given an array of n objects ...

  5. Lintcode: Majority Number II 解题报告

    Majority Number II 原题链接: http://lintcode.com/en/problem/majority-number-ii/# Given an array of integ ...

  6. [LintCode] Wiggle Sort II 扭动排序之二

    Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...

  7. [LintCode] Paint House II 粉刷房子之二

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  8. [LintCode] House Robber II 打家劫舍之二

    After robbing those houses on that street, the thief has found himself a new place for his thievery ...

  9. lintcode:背包问题II

    背包问题II 给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大? 注意事项 A[i], V[i], n, m均为整数.你不能将物品进行切分.你所挑选的 ...

随机推荐

  1. maven学习手记 - 1

    学习目标 windows下安装maven环境: 使用命令创建maven项目结构: maven项目编译测试打包安装运行: 在maven项目中使用插件.   在windows下安装maven环境 在win ...

  2. 微信支付.NET版开发总结(JS API),好多坑,适当精简。

    前2天,做一个手机网页的微信支付的项目,费了好些周折,记录一下.接下来,按照开发步骤,细数一下,我遇到的那些坑. [坑1]官方邮件中下载的demo只有PHP版本,其他版本没有给链接.可能让人误以为只有 ...

  3. PB中无法插入ole控件,解决办法

    cmd /c for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %icmd /c for %i in (%windir%\system32\ ...

  4. 如何把bootstrap用webpack打包

    今天下载了一个anguarl2写后台,一直没有找到是如何使用bootstrap样式的,然后就全文做了搜索,发现有一段代码 import 'bootstrap-loader'; 这段代码很可疑,所以就查 ...

  5. spring IOC源码分析(1)

    1.何谓Spring IOC 何谓Spring IOC?书上谓之“依赖注入”,那何谓“依赖注入”? 作为一个Java程序猿,应该遇到过这样的问题,当你在代码中需要使用某个类提供的功能时,你首先需要ne ...

  6. Write operations are not allowed in read-only mode (FlushMode.NEVER/

    今天在做ssh项目开发的时候遇到一个问题,保存数据的时候报错: Write operations are not allowed in read-only mode (FlushMode.NEVER/ ...

  7. windows phone和android,ios的touch事件兼容

    1.开发背景 最近用html5写了个小游戏,中间踩过无数坑,有很多甚至百度都百度不到答案,可见html5还真是不成熟,兼容性的复杂度比ie6有过之而无不及,性能那个渣简直无力吐槽.. 好了,吐槽结束, ...

  8. Python 获取学校图书馆OAPC账号对应的身份证号码

    import urllib.request import urllib.parse import http.cookiejar import re lib_login = 'http://xxx.ed ...

  9. 在Eclipse新建菜单中添加JSP

    在开发的时候,大家可能选择不同的透视图,下面以Java EE透视图为例. 在项目上右键,选择new命令,出来的菜单中并没有新建JSP的选项. 这样一来,如果想新建JSP,只能选择Other命令,在里面 ...

  10. chm文件右边部分查看不了

    右键属性-> 下面好像有句话是说该文件来自网络为保护您的计算机什么什么的,, 然后你解除锁定就能用了 版权声明:本文为博主原创文章,未经博主允许不得转载.