动态规划_简单多dp问题_打家劫舍_打家劫舍2_C++

一.题目解析(打家劫舍1)

题目中提到不能偷相邻位置的东西

算法讲解

1.状态表示

f[i]表示到i位置时选择,打劫的最大钱财

g[i]表示到i位置时不选择,打劫的最大钱财

2.状态转移方程

3.初始化

观察状态转移方程就是0的位置会发生越界,所以考虑f[0],g[0]

f[0]表示到零位置选择打劫的总值,所以f[0]=nums[0]

同理g[0]=nums[0]

4.填表顺序

从左到右

5.返回值

return max(f[n-1],g[n-1])

二.代码实现

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        vector<int>f(n),g(n);
        g[0]=0;f[0]=nums[0];
        for(int i=1;i<n;i++)
        {
            f[i]=g[i-1]+nums[i];
            g[i]=max(g[i-1],f[i-1]);
        }
        return max(g[n-1],f[n-1]);
    }
};

三.题目解析(打家劫舍2)

原来的数组(房子)是相连的,现在我们将所有房子连成一个环

打家劫舍1在第一题中有详细讲解

打家劫舍2代码实现

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        return max(nums[0]+rob(nums,2,n-2),rob(nums,1,n-1));
    }
    int rob(vector<int>nums,int x,int y)
    {
        if(x>y)return 0;
        int n=nums.size();
        vector<int>f(n),g(n);
        f[x]=nums[x];
        for(int i=x+1;i<=y;i++)
        {
            f[i]=g[i-1]+nums[i];
            g[i]=max(g[i-1],f[i-1]);
        }
        return max(f[y],g[y]);
    }
};
相关推荐
项目申报小狂人4 分钟前
一种使用双向长短时记忆网络结合鲸鱼优化算法的类火星矿物元素精确定量分析模型
人工智能·算法·lstm
神仙别闹5 分钟前
基于Java+MySQL实现(GUI)医院管理系统
java·mysql·oracle
wangjialelele9 分钟前
【SystemV】基于建造者模式的信号量
linux·c语言·c++·算法·建造者模式
njsgcs15 分钟前
制作solidworks插件 装配体导出展开耗时分析
开发语言·c#·solidworks
C137的本贾尼16 分钟前
别怕异步:`async` 和 `await` 的简单理解
开发语言·python
njsgcs25 分钟前
c# solidworks 标注攻牙
开发语言·c#·solidworks
吴声子夜歌37 分钟前
Java——显示条件
java·开发语言
有味道的男人37 分钟前
1688 商品价格 API:阶梯价、代发价、批发价实时查询
开发语言·windows·python
AC赳赳老秦42 分钟前
OpenClaw与WPS宏联动:批量执行WPS复杂操作,解决办公表格批量处理难题
java·前端·数据库·自动化·需求分析·deepseek·openclaw
范范@44 分钟前
python基础-for循环和列表
开发语言·python