力扣198题:打家劫舍 动态规划二维状态枚举

文章讲述了如何使用动态规划算法解决在一排房屋中选择非相邻房屋进行偷窃的问题,通过定义状态表示和计算规则,得出每个房屋采取不同策略的最大收益,最终返回整个过程的最大收益。时间复杂度为O(n),空间复杂度也为O(n)。
摘要由CSDN通过智能技术生成

 题目


 

思路

题目要求在一排房屋中选择一定数量的房屋进行偷窃,但不能偷相邻的房屋。首先,我们可以观察到对于第 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;
    }
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值