打劫房屋 II
2016-04-29 19:57
190 查看
在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。
样例
给出nums =
解题思路:和这个差不多,一样是动态规划。只不过圈起来了。
仅对最后一所房子进行讨论,
如果不打劫,和前一篇文章一样,此时结果为r1 = dp[nums.length - 1][0];
如果打劫,则意味着第一所房子不能打劫,即dp[0][0] = dp[0][1] = 0,这样重来一次动态规划,此时的结果为 r2 = dp[nums.length-1][1];
最终结果为max(r1, r2).
代码:
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。
样例
给出nums =
[3,6,4], 返回
6, 你不能打劫
3和
4所在的房间,因为它们围成一个圈,是相邻的.
解题思路:和这个差不多,一样是动态规划。只不过圈起来了。
仅对最后一所房子进行讨论,
如果不打劫,和前一篇文章一样,此时结果为r1 = dp[nums.length - 1][0];
如果打劫,则意味着第一所房子不能打劫,即dp[0][0] = dp[0][1] = 0,这样重来一次动态规划,此时的结果为 r2 = dp[nums.length-1][1];
最终结果为max(r1, r2).
代码:
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]; int[][] dp = new int[nums.length][2]; dp[0][1] = nums[0]; for(int i=1;i<nums.length ;++i){ dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0]); dp[i][1] = dp[i-1][0] + nums[i]; } int r1 = dp[nums.length-1][0]; dp[0][1] = 0; for(int i=1;i<nums.length ;++i){ dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0]); dp[i][1] = dp[i-1][0] + nums[i]; } return Math.max(dp[nums.length-1][1], r1); } }
相关文章推荐
- mysql关闭与删除bin-log日志详解
- Xshell和Xftp的安装与使用教程
- 查找某一目录下的所有文件名
- Zabbix通过SNMP监控Linux主机
- 判断是否为闰年
- VNC/Servers(总结)
- OpenCV在linux平台的编译、安装和使用
- HDU2544:最短路(Dijkstra)
- uva 11008 Antimatter Ray Clearcutting 记忆化搜索
- POJ 1328 Radar Installation
- ♥NYOJ 123-士兵杀敌(四)【线段树&&树状数组】
- C# 小伎俩给PDF添加图片背景
- tiny6410的QT4.7开发与移植
- CArchive类基本读写
- LightOJ - 1425 The Monkey and the Oiled Bamboo (水)
- 集合划分问题(贝尔数)
- 工厂设计模式之:简单工厂、工厂方法、抽象工厂
- 构建之法阅读笔记05
- 爆打团队 四则运算 beta视频
- C++中多字节与双字节的字符的转换