美文网首页动态规划
HouseRobber系列问题(DP)

HouseRobber系列问题(DP)

作者: MikeShine | 来源:发表于2019-04-12 09:55 被阅读4次

这里我们看一下Leet上面 HouseRobber 系列问题,这里都是用 动态规划(DynamicProgramming)来做的。需要理解一下动态规划的相关知识。

1. HouseRobber

给出一个数组代表每一个商户的钱。要求选出不连续的n个商户,使得加起来的钱最多。
用例:[1,2,3,1] ==> 4 这里抢 1,3
[2,1,1,2] ==> 4 这里抢 2,2

分析

如果单单看 [1,2,3,1] 这个用例很容易把题目理解成在数组中选奇数个或者偶数个的问题。写了代码,Submit。发现出来错误的用例,即第2个用例。其实不是简单的奇数个偶数个的问题,是复杂一点的问题。

思路

这里是一个求极值的问题,是典型的动态规划的问题。对于动态规划,最关键的一步就是寻找 递推公式
具体到这个问题上,从后往前想(从结果出发):到第n家,抢到最大钱数的结果分为两种情况---(1)抢第n家,即不能抢第n-1家,再加上之前(n-2) 家抢到的最大钱数。(2)不抢第n家,即之前 (n-1)家抢到的最大钱数。所以最终的递推公式为:T(n) = max(T(n-1), n+T(n-2))
我们维护一个等长的数组,用于存储当前位置可以获得最大的钱数,最终返回该数组的最后一个元素即可。

代码

package day_34;

import com.sun.xml.internal.ws.encoding.MtomCodec;

//   不能取连续的元素,然后取出和最大的元素。
//   对实现方式没有要求。
//   求极值的问题首先考虑 DynamicProgramming。
//   抢到第n家时候,要么不抢n-1家,这时候是前 n-2家+第n家
//                要么不抢第n家,是前 n-1 家抢的
//   这里新建一个 dp 数组用于存储到第n家时候抢到的钱
public class HouseRobber {
    public int rob(int[] nums){
            int dp[] = new int[nums.length];
            dp[0] = nums[0];
            dp[1] = Math.max(nums[0],nums[1]);
            for(int i=2;i<nums.length;i++){
            dp[i] = Math.max(nums[i]+dp[i-2],dp[i-1]);
            }
            return dp[dp.length-1];
    }

    public static void main(String args[]){
        int a[] = {2,1,1,2};
        HouseRobber h = new HouseRobber();
        System.out.println(h.rob(a));
    }
}

相关文章

  • HouseRobber系列问题(DP)

    这里我们看一下Leet上面 HouseRobber 系列问题,这里都是用 动态规划(DynamicProgramm...

  • AcWing 285. 没有上司的舞会

    AcWing 285. 没有上司的舞会 树形dp 从小偷系列问题演变过来的树形dp问题

  • LeetCode之Unique Paths(Kotlin)

    问题: 方法:经典的动态规划问题,dp[i][j] = dp[i-1][j] + dp[i][j-1],然后dp遍...

  • 131(132、1278)-分割回文串Ⅰ、Ⅱ、Ⅲ-字符串DP问题

    写在前面 这三道题可以算是一个小系列了,都是DP相关的问题。因为没怎么做过字符串DP的相关问题,在定义数组的时候真...

  • DP问题

    DP问题常用来解决最优解能由子最优解构成的问题。 核心问题就是我是谁,我从哪里来,我到哪里去。 我是谁 就是代表现...

  • DP问题

    多重部分和问题 模板题 代码 Holding Bin-Laden Captive!这道题的数组得开的很小心,太小了...

  • 动态规划

    1、简介动态规划(Dynamic Programming,DP)是求解决策过程最优化的过程,把原始问题划分成一系列...

  • 算法@LeetCode:HouseRobber

    Log 【170422】完成 01 版提交(Python) 【170423】研究过参考答案并记录 题目 House...

  • Leetcode 【39、40、77】

    问题描述:【DFS、DP】39. Combination Sum 解题思路: 这道题和 Leetcode 【DP】...

  • 偶遇DP问题

    今天偶然遇到一个买卖股票最佳时机(best-time-to-buy-and-sell-stock)的问题。这个问题...

网友评论

    本文标题:HouseRobber系列问题(DP)

    本文链接:https://www.haomeiwen.com/subject/ijeqwqtx.html