leetcode213. 打家劫舍 II

本文解析了LeetCode中的打家劫舍II问题,通过动态规划方法,将问题拆分为两部分,避免连续抢劫。关键在于理解状态转移方程dp[i]=max(dp[i-2]+nums[i], dp[i-1]),并利用递归函数myrob实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

213. 打家劫舍 II - 力扣(LeetCode) (leetcode-cn.com)

算法:动态规划

思想:这题可以转化为打家劫舍I

这题相比打家劫舍1增加了一个条件第一个房屋和最后一个房屋是紧挨着的,意思是偷了最后一家就不能偷第一家偷了第一家就不能偷最后一家

所以我们将数组才分成两个数组,一个是考虑最后一家,一个是不考虑最后一家。

这里说的是考虑而不是选择,因为不一定要选。

拆分出来的这两个数组取出他们之间抢劫金额的最大值就是答案,每一个拆分出来的数组都是第一题解法,可以将第一题打家劫舍的内容打包成一个函数然后调用两次即可,这样就和打家劫舍1一模一样

因为不能偷相邻的,所以定义状态dp表示的是偷第i家所获得的最大金额。

因为不能偷相邻的所以如果选择第i家偷的话那这第i家就要从i-2基础上在加个nums[i],选择不偷的话就还是i-1然后两者之间的最大值就是结果

状态方程是 dp[i]=max(dp[i-2]+nums[i],dp[i-1])

int max(int a,int b)
{
    return a>b?a:b;
}
int myrob(int*nums,int x,int numsSize)
{
    if(x==numsSize)//当只有一个的时候就直接返回nums
    return nums[x];
    int dp[2000]={0};
    dp[x]=nums[x]; //初始化偷第x家的时候
    dp[x+1]=max(nums[x],nums[x+1]);//选择第一家和第二家直接最大的
    for(int i=x+2;i<=numsSize;i++)
    {
       dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
    }
    return dp[numsSize];
}
int rob(int* nums, int numsSize){
if(numsSize==1)
return nums[0];
int res=myrob(nums,0,numsSize-2);//将数组拆分
int res2=myrob(nums,1,numsSize-1);
return max(res,res2);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值