题解
打劫家舍 1(01背包)
- 题意:村里的房屋成一字排列,现在给定一个数组
nums
里面每个数据代表对应编号房屋中的财产。有一个强盗想在这个村庄中打劫,但是如果连续打劫两家相邻的房屋,会导致系统报警,请设计一个算法,在不出动警报的情况下让强盗获取最大金额 - 题解:很直接的01背包问题,因为要表示最大值,我们首先考虑针对每个房屋的状态表示。我们可以利用
dp[i]
表示第i
家房屋之前,最多能够打劫多少金额,那么如果下次打劫如果用上了dp[i]
,就不用考虑i
之前的状态了。- 现在考虑
dp[i]
是如何通过上一个状态转换而来的,毫无疑问,dp[i]
只能通过两种状态转换来,一种是打劫了i-1
,那么此时dp[i]=dp[i-1]
,另一种是没有打劫,那么这一家就可以打劫,有dp[i]=dp[i-2]+nums[i]
,在两者之间取最大值,dp[i]
的最大状态就能计算得到。 - 实现
class Solution { public int rob(int[] nums) { int n = nums.length; if(n <= 0) return 0; int []dp = new int[n+1]; dp[0] = 0; dp[1] = nums[0]; for(int i = 2;i <= n;i++) dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i-1
- 现在考虑