题目![](https://i-blog.csdnimg.cn/blog_migrate/26935cb0adbaf038de16915dba94e6f7.png)
思路
题目要求在一排房屋中选择一定数量的房屋进行偷窃,但不能偷相邻的房屋。首先,我们可以观察到对于第 i 个房屋,我们有两种选择:偷或者不偷。如果选择偷,则收益为第 i-1 个房屋不偷的收益加上当前房屋的价值;如果选择不偷,则收益为截止到前一个循环的最大收益(res)。通过动态规划的思想,我们可以得到每个房屋采取不同策略的最大收益,从而在循环结束时得到整体的最大收益。
解题方法
状态表示:dp[i][j]表示对于对于i房屋采取j策略的收益,j为1是偷,为0不偷
状态计算:dp[i][1]=dp[i-1][0]+nums[i];dp[i][0]=res;
复杂度
时间复杂度: O(n)
空间复杂度: O(n)
Code
class Solution {
public int rob(int[] nums) {
int n=nums.length;
//dp[i][j]表示对于对于i房屋采取j策略的收益
//dp[i][1]表示偷,res[i][0]表示不偷
int[][] dp = new int[n][2];
//初始化第一个房屋
dp[0][1]=nums[0];
dp[0][0]=0;
//res每轮循环过后记录的都是当前最大收益
int res=nums[0];
for(int i=1;i<n;i++){
//第i间房屋偷的最大收益为第i-1间房屋不偷的最大收益加上第i间房屋的价值
dp[i][1]=dp[i-1][0]+nums[i];
//第i间房屋不偷的最大收益为截止前一个循环的最大收益,即res
dp[i][0]=res;
//这轮循环结束res更新
res=Math.max(dp[i][1],res);
}
return res;
}
}