欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【刷题笔记】打家劫舍问题

【刷题笔记】打家劫舍问题

2025/9/2 11:49:10 来源:https://blog.csdn.net/2301_79181030/article/details/141927061  浏览:    关键词:【刷题笔记】打家劫舍问题

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

题目一

题目链接:打家劫舍I
思路
小偷每到一初,都可以选择对这个位置偷还是不偷,所以,这次我们需要定义两个表

小Tips:针对这种情况,一般上都需要定义两个dp表,因为每一个位置我们都可以选择。

  • 状态表示:

    • f[i]:表示第i家小偷偷,得到的总金额。
    • g[i]:表示第i家小偷不偷,得到的总金额。
  • 状态转移方程

    • f[i]:f[i]=g[i-1]+nums[i]。

      • 第i家偷的话,就意味着第i-1家不可以偷。
    • g[i]:g[i]=max(f[i-1],g[i-1])

      • 不偷第i家的话,那么就要看第i-1家是偷还是不偷了。

    代码表示

class Solution {
public:int rob(vector<int>& nums) {//创建dp表//初始化//填表//返回值int ret=nums.size();if(ret==1) return nums[0];vector<int> f(ret);//此位置选auto g=f;//此位置不选f[0]=nums[0];g[0]=0;int i=0;for(i=1;i<ret;i++){f[i]=g[i-1]+nums[i];g[i]=max(f[i-1],g[i-1]);}return max(f[ret-1],g[ret-1]);}
};

题目二

题目链接:打家劫舍二
思路
这道题和上一道题的不同之处在于:本道题的题目设定是:最后一家和第一家是连着的,也就是说第一家和最后一家只可以偷一家。

所以我们要封装一个函数,以第一家偷还是不偷为两种不同的情况进行划分。

class Solution {
public:
int rob1(int left,int right,vector<int>&nums)
{if(left>right) return 0;if(left==right) return nums[left];int ret=nums.size();vector<int> f(ret);//改位置要抢劫auto g=f;//该位置不盗for(int i=left;i<=right;i++){f[i]=g[i-1]+nums[i];g[i]=max(f[i-1],g[i-1]);}return max(f[right],g[right]);
}int rob(vector<int>& nums) {int ret=nums.size();return max(rob1(1,ret-1,nums),rob1(2,ret-2,nums)+nums[0]);}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词