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的长度
空间复杂度:文章来源:https://www.toymoban.com/news/detail-809875.html
O ( n ) O(n) O(n)文章来源地址https://www.toymoban.com/news/detail-809875.html
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]);
}
}
到了这里,关于力扣198. 打家劫舍(java 动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!