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的更多相关文章

  1. leetcode:House Robber(动态规划dp1)

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  2. 一道简单的动态规划题目——House Robber

    一.题目 House Robber(一道Leetcode上的关于动态规划的简单题目)具体描述如下: There is a professional robber planning to rob hou ...

  3. LeetCode之“动态规划”:House Robber && House Robber II

    House Robber题目链接 House Robber II题目链接 1. House Robber 题目要求: You are a professional robber planning to ...

  4. leetcode-198-House Robber(动态规划)

    题目描述: You are a professional robber planning to rob houses along a street. Each house has a certain ...

  5. Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber)

    Leetcode之动态规划(DP)专题-198. 打家劫舍(House Robber) 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互 ...

  6. Leetcode 198 House Robber 动态规划

    题意是强盗能隔个马抢马,看如何获得的价值最高 动态规划题需要考虑状态,阶段,还有状态转移,这个可以参考<动态规划经典教程>,网上有的下的,里面有大量的经典题目讲解 dp[i]表示到第i匹马 ...

  7. 动态规划 - 213. House Robber II

    URL: https://leetcode.com/problems/house-robber-ii/ You are a professional robber planning to rob ho ...

  8. 动态规划 - 198. House Robber

    URL : https://leetcode.com/problems/house-robber/ You are a professional robber planning to rob hous ...

  9. 213. House Robber II(动态规划)

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

随机推荐

  1. centos7 安装后,出现Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]

    PS:出现以上信息,是要求你阅读或者接收协议: Initial setup of CentOS Linux 7 (core)解决步骤如下: 1,输入[1],按Enter键阅读许可协议,2,输入[2], ...

  2. MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具

    mybatis – MyBatis 3 | 日志 http://www.mybatis.org/mybatis-3/zh/logging.html MyBatis 内置日志工厂基于运行时自省机制选择合 ...

  3. 多线程下载图片,滑动tableView崩溃--资源抢夺问题

    最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.htm ...

  4. vue - 准备知识

    一.知识 http://www.cnblogs.com/majj/https://www.cnblogs.com/majj/category/1216624.html 阮一峰 es6http://es ...

  5. 12.GIT多人协作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 查看远程库的信息 $ git remote origin $ ...

  6. Flex 布局:实例篇

    上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法.你会看到,不管是什么布局,Flex往往都可以几行命令搞定. ​ 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇& ...

  7. 微软威胁情报中心总经理的十句话——From John Lambert——太精辟了.......

                                                      微软威胁情报中心总经理 John Lambert的十句话   1. What is the most ...

  8. Flask系列(八)flask-session组件

    一.简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保 ...

  9. PAT 1111 Online Map[Dijkstra][dfs]

    1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...

  10. Django中间件的5种自定义方法

    阅读目录(Content) Django中间件 自定义中间件 中间件(类)中5种方法 中间件应用场景 回到顶部(go to top) Django中间件 在http请求 到达视图函数之前   和视图函 ...