动态规划-House Robber
2018-04-29 20:20:56
House Robber问题是leetcode上经典的系列题,这里对其中的题目做一个讲解。
198. House Robber
问题描述:
问题求解:
本质上就是求解不连续取数的情况下能获得最大价值。可以使用动态规划来解决。
dp[i][0]:第i个数没有取能获得的最高价值
dp[i][1]:第i个数取能获得的最高价值
初始值:dp[-1][0] = 0,dp[-1][1] = -INF
递推关系式:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1])
dp[i][1] = dp[i - 1] + nums[i]
public int rob(int[] nums) {
int[][] dp = new int[nums.length + 1][2];
dp[0][0] = 0;
dp[0][1] = Integer.MIN_VALUE;
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 - 1];
}
return Math.max(dp[nums.length][0], dp[nums.length][1]);
}
可以对空间复杂度进行优化:
public int rob(int[] nums) {
int dp0 = 0;
int dp1 = Integer.MIN_VALUE;
for (int i = 1; i <= nums.length; i++) {
int tmp = dp0;
dp0 = Math.max(dp1, dp0);
dp1 = tmp + nums[i - 1];
}
return Math.max(dp0, dp1);
}
213. House Robber II
问题描述:
问题求解:
相较于上一题,本题出现了环路,显然的是如果状态是环路的话是无法运用dp的,因为dp是只考虑目前的情况,无后效性,而环路则意味着后面的状态会影响前面的状态,因此,我们要解决这个问题,首先要做的就是考虑使用某种手段来将环路打开。
对于rob问题,如果第i间屋子没有偷窃的话,那么第i + 1间屋子就可以任意取,也就是对于i + 1间屋子来说第i间屋子和不存在是一样的,因此我们可以在没有被偷窃的屋子上将环路断开。
下面考虑第n间屋子,他有两个状态,一是被偷窃,则第 n + 1间屋子必然没有被偷,则从 n + 1 处断开;二是没有被偷,则直接在 n 处断开。
public int rob(int[] nums) {
if (nums.length == 1) return nums[0];
return Math.max(helper(nums, 0, nums.length - 2), helper(nums, 1, nums.length - 1));
} private int helper(int[] nums, int l, int r) {
int dp0 = 0;
int dp1 = Integer.MIN_VALUE;
for (int i = l; i <= r; i++) {
int tmp = dp0;
dp0 = Math.max(dp0, dp1);
dp1 = tmp + nums[i];
}
return Math.max(dp0, dp1);
}
337. House Robber III
问题描述:
问题求解:
本题是从数据结构的角度对原问题进行了扩展,将场景变到了二叉树上,限制条件依然是不能连续偷取。
从本质上来说,每个结点依然是两个状态,一是偷取了,二是没有偷取,因此,我们依然可以使用动态规划的方法自低向上的将每个结点的左右儿子结点的状态都得到后,再计算自己的值。
public int rob(TreeNode root) {
int[] res = helper(root);
return Math.max(res[0], res[1]);
} private int[] helper(TreeNode root) {
if (root == null) return new int[2]; int[] res = new int[2];
int[] L = helper(root.left);
int[] R = helper(root.right); res[0] = Math.max(L[0], L[1]) + Math.max(R[0], R[1]);
res[1] = L[0] + R[0] + root.val;
return res;
}
动态规划-House Robber的更多相关文章
- leetcode:House Robber(动态规划dp1)
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- 一道简单的动态规划题目——House Robber
一.题目 House Robber(一道Leetcode上的关于动态规划的简单题目)具体描述如下: There is a professional robber planning to rob hou ...
- LeetCode之“动态规划”:House Robber && House Robber II
House Robber题目链接 House Robber II题目链接 1. House Robber 题目要求: You are a professional robber planning to ...
- leetcode-198-House Robber(动态规划)
题目描述: You are a professional robber planning to rob houses along a street. Each house has a certain ...
- Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber)
Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber) 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互 ...
- Leetcode 198 House Robber 动态规划
题意是强盗能隔个马抢马,看如何获得的价值最高 动态规划题需要考虑状态,阶段,还有状态转移,这个可以参考<动态规划经典教程>,网上有的下的,里面有大量的经典题目讲解 dp[i]表示到第i匹马 ...
- 动态规划 - 213. House Robber II
URL: https://leetcode.com/problems/house-robber-ii/ You are a professional robber planning to rob ho ...
- 动态规划 - 198. House Robber
URL : https://leetcode.com/problems/house-robber/ You are a professional robber planning to rob hous ...
- 213. House Robber II(动态规划)
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
随机推荐
- pandas处理日期时间,按照时间筛选
pandas有着强大的日期数据处理功能,本期我们来了解下pandas处理日期数据的一些基本功能,主要包括以下三个方面: 按日期筛选数据 按日期显示数据 按日期统计数据 运行环境为 windows系统, ...
- mysql查看线程详解(转载)
如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的 MySQL 帐户运行的线程). mysql> show processlist; +—–+——— ...
- SELECT INTO 和 INSERT INTO SELECT
做数据库开发的过程中难免会遇到有表数据备份的,而SELECT INTO……和INSERT INTO SELECT…… 这两种语句就是用来进行表数据复制,下面简单的介绍下: 1.INSERT INTO ...
- Sublime Text 2/3 安装Emmet(Zencoding)以及常见使用,一种快速编写HTML/CSS代码的方法
原文链接http://blog.csdn.net/shirley254/article/details/52336744
- instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例 , 返回true或者false
<?phpclass MyClass{} class NotMyClass{}$a = new MyClass; var_dump($a instanceof MyClass);var_dump ...
- nginx挂维护页面
本篇文章摘抄于他人的文章,来自于CSDN的JeremyIT同学,但我还是自己重新敲一遍. 实现的效果是:访问网站的任何页面,都跳转到同一个页面.而这一个页面就是维护页面,可以根据需要修改. serve ...
- 您好,前端使用https,后端使用https是会有冲突的情况,所以默认后端都是http 负载均衡即可管理证书,不需要在后端ECS上绑定证书。
您前端使用https,那么前端就是加密的,后端使用https就是会访问出现问题的,目前阿里云负载均衡默认的配置前端使用https,后端默认就是http,也是无法更改的. 前端使用https,目前只有一 ...
- Python菜鸟之路:Django Admin后台管理功能使用
前言 用过Django框架的童鞋肯定都知道,在创建完Django项目后,每个app下,都会有一个urls.py文件,里边会有如下几行: from django.contrib import admin ...
- (2.14)Mysql之SQL基础——游标
(2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...
- 怎么应对 domino文档损坏然后损坏文档别删除导致数据丢失
对于domino 有个机制是同步 ..然后如果文档被损坏之后会通过同步或者压缩 之类的 然后将损坏文档删除 那么这样就有个风险..知识管理文档会被删除. 并且删除了之后管理员如果不仔细看日志的话也不会 ...