力扣198. 打家劫舍(java 动态规划)

发布时间:2024年01月15日

Problem: 198. 打家劫舍

题目描述

在这里插入图片描述在这里插入图片描述

思路

1.构建多阶段决策模型:n个房屋对应n个阶段,每一个阶段决定一个房间是偷还是不偷,两种决策:偷、不偷
2.定义状态:不能记录每个阶段决策完之后,小偷可偷的最大金额,需要记录不同决策对应的最大金额,也就是:这个房屋偷-对应的最大金额;这个房屋不偷-对应的最大金额。int[n][2]记录每个阶段的状态,dp[i][0]表示第i个物品不偷,当下剩余的最大金额;dp[i][1]表示第i个物品偷,当下剩余的最大金额;
3.定义状态转移方程:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1])即表示假设不偷则当前阶段可以获得的最大值为上一个房屋偷或者不偷的二者中的最大金额;dp[i][1] = dp[i - 1][0] + nums[i]即表示假设当前阶段偷则当前可以获得的最大金额为上一个房屋不偷加上当前当前房屋的金额

解题方法

1.获取nums数组的长度为n;并定义int类型数组dp:int[][] dp = new int[n][2];
2.初始化dp[0][0]为0,dp[0][1]为nums[0];
3.完成动态转移方程;
4.返回max(dp[n - 1][0], dp[n - 1][1])

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为数组nums的长度

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
    /**
     * Get the maximum amount
     *
     * @param nums Given array(Store the amount of each house)
     * @return int
     */
    public int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int n = nums.length;
        int[][] dp = new int[n][2];
        //dp[i][0] represents the maximum amount
        // that can currently be obtained without stealing
        dp[0][0] = 0;
        //dp[i][1] represents the maximum amount
        // that can be obtained when not stealing
        dp[0][1] = nums[0];
        for (int i = 1; i < n; ++i) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
            dp[i][1] = dp[i - 1][0] + nums[i];
        }
        return Math.max(dp[n - 1][0], dp[n - 1][1]);
    }
}
文章来源:https://blog.csdn.net/LNsupermali/article/details/135604068
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。