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

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

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

算法讲解

1.状态表示

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

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

2.状态转移方程

3.初始化

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

f0表示到零位置选择打劫的总值,所以f0=nums0

同理g0=nums0

4.填表顺序

从左到右

5.返回值

return max(fn-1,gn-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]);
    }
};
相关推荐
SL_staff2 分钟前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10119 分钟前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找
0+11116 分钟前
算法 --链表
数据结构·算法·leetcode·链表
geats人山人海19 分钟前
java 4继承
java·开发语言
aqiu11111131 分钟前
【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结
开发语言·c++·算法
众链网络42 分钟前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务
周小董1 小时前
[1371]jdk管理工具
java·开发语言
Terra.K1 小时前
高精度阶乘求和模板深度解析
开发语言·c++·算法
Hum8le1 小时前
漏洞知识点《php伪协议》
开发语言·安全·web安全·php
青春逝如流水1 小时前
Java 中线程的创建方式:从基础到现代
java·开发语言·多线程·ai文章