lintcode:打劫房屋II
题目
在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。
样例
给出nums = [3,6,4]
, 返回 6
, 你不能打劫3
和4
所在的房间,因为它们围成一个圈,是相邻的.
解题
根据题目,第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的更多相关文章
- 打劫房屋 · House Robber
[抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...
- lintcode:打劫房屋 III
题目 打劫房屋 III 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树.与前两次偷窃 ...
- lintcode:打劫房屋
题目 打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动 ...
- Lintcode: Sort Colors II 解题报告
Sort Colors II 原题链接: http://lintcode.com/zh-cn/problem/sort-colors-ii/# Given an array of n objects ...
- Lintcode: Majority Number II 解题报告
Majority Number II 原题链接: http://lintcode.com/en/problem/majority-number-ii/# Given an array of integ ...
- [LintCode] Wiggle Sort II 扭动排序之二
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- [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 ...
- [LintCode] House Robber II 打家劫舍之二
After robbing those houses on that street, the thief has found himself a new place for his thievery ...
- lintcode:背包问题II
背包问题II 给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大? 注意事项 A[i], V[i], n, m均为整数.你不能将物品进行切分.你所挑选的 ...
随机推荐
- c/c++常用代码--udp多播
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <winsock.h ...
- generate the next AttestationNumber, 格式是ICD-EPRG-DEV-0000000001,ICD-EPRG-DEV-0000000002
private static int GetNextAttestationNumber(string maxAttestationNumber) { //generate the next Attes ...
- [SSH服务]——一些安全性配置和补充实验
SSH 安全性和配置 转载于 http://www.ibm.com/developerworks/cn/aix/library/au-sshsecurity/ 对于一些之前列举的代码示例,许多系统管理 ...
- CentOS7下通过rpm方式安装MySQL及插入中文问题解决 [原创]
一 CentOS下通过rpm方式安装MySQL CentOS版本:CentOS-7 MySQL版本:MySQL-5.6.22 在网上搜了一下,Linux下安装MYSQL有三种方式: 1) 通过yum命 ...
- 团队开发——第一篇scrum报告
一.角色介绍 产品负责人(兼项目经理PM):王雪青 scrum master: 陆宇 开发团队:赵建松.张文冬.徐擎天 二.product backlog 1.买家登录后,显示各个小吃摊的信息,主要是 ...
- 团队项目——二手书店(NABC分析)
特色:可发布 N:登陆用户可自行发布售书信息,为学生提供一个网上交易旧书的平台. A:后台数据库管理,对于新登陆的用户信息加以整合,统一发布. B:想出手旧书的学生可从中获取不小的利益,而且也可以实现 ...
- 浅谈IT
在没有学计算机应用技术之前我对IT的认知度几乎为零,曾经还天真的认为IT就是白领,只要做上IT行业,以后便可高枕无忧.后来阴差阳错学了这个专业.通过一年的学习,虽然学艺不精但多少对IT行业了解的一知半 ...
- 【BZOJ】【1012】【JSOI2008】最大数maxnumber
线段树 ……现在再来看这题感觉好水啊,当年的大老虎现在也变成小花猫了,真是令人感动<_< /************************************************ ...
- iOS开发如何实现消息推送机制
一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的.一般说来,当要显示消息 ...
- mysql导出导入某张表
一般表数据少的话都用图形界面了,看着比较方便. 如果表中数据比较多,用图形界面极容易卡死,这个时候就要用到命令行了. 用命令行导出导入大量数据还是比较快的,方法如下: 导出库db1中的表table1: ...