牛客网:打家劫舍

本文探讨了使用动态规划算法求解一个贼在有限房间中偷窃的问题,通过比较偷与不偷每间房的价值,确定最大能偷走的总价值。讨论了两种情况:一端偷窃限制和环形偷窃路径。代码实现展示了如何运用dp[i-1]和dp[i-2]来更新状态。
摘要由CSDN通过智能技术生成

1.

我们设一个dp[i]表示前i个房间的能偷的最大价值。

很明显dp[1]=num[0], 其后,对每个房间我们可以选择偷或者不偷。在不偷的情况下直接就是dp[i-1],在偷的时候就是dp[i-2]+num[i-1]

代码如下所示:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int rob(vector<int>& nums) {
        // write code here
        int size=nums.size();
        vector<int> dp(size+1, 0);
        dp[1]=nums[0];
        for(int i=2;i<=size;++i){
            dp[i]=max(dp[i-1], nums[i-1]+dp[i-2]);
        }
        return dp[size];
    }
};

2.

比起上边那个其实就是这里是个环而不是一个单纯的数列了。

但是两端只有两种可能:

如果我们偷第一个房间,我们就不偷最后一个房间,表现出来就是最后一个数不进行状态转移,直接取前一个的值

如果我们不偷第一个房间,直接遍历数组转移一遍即可

最后比较两个值谁大就用哪个

代码如下所示:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int rob(vector<int>& nums) {
        // write code here
        vector<int> dp(nums.size()+1, 0);
        dp[1]=nums[0];
        for(int i=2;i<nums.size();++i){
            dp[i]=max(dp[i-1], dp[i-2]+nums[i-1]);
        }
        int res=dp[nums.size()-1];
        dp.clear();
        dp[1]=0;
        for(int i=2;i<=nums.size();++i){
            dp[i]=max(dp[i-1], dp[i-2]+nums[i-1]);
        }
        res=max(res, dp[nums.size()]);
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值