[LeetCode]198. 打家劫舍(House Robber)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40914991/article/details/81281058

一、题目:

LeetCode地址

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互

连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]

输出: 4

解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入: [2,7,9,3,1]

输出: 12

解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

二、分析:

该题利用了五大算法之二:动态规划算法

1、基本概念:

     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

2、基本思想与策略:

     基本思想与分治法类似,也是将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后个子问题就是初始问题的解。

具体请自行百度

三、Java代码

private static int minCostClimbingStairs(int[] nums) {
        int curMax = 0, curPrePreMax = 0;
        for (int cur : nums) {
            int temp = curMax;
            curMax = Math.max(curMax, curPrePreMax + cur);
            curPrePreMax = temp;
        }
        return curMax;
    }

对于该题而言,循环遍历所有的房屋,决策后,保存前两次的决策结果,从上次的决策结果与上上次的决策结果中,再次决策出最优解,从而避免了[2,7,9,3,1,9]的结果是2+9+9,而不是7+3+9。

四、提交结果

猜你喜欢

转载自blog.csdn.net/qq_40914991/article/details/81281058
今日推荐