【错题集-编程题】不相邻取数(动态规划 - 线性 dp)

简介: 【错题集-编程题】不相邻取数(动态规划 - 线性 dp)


一、分析题目

状态表示:

  • f[i]:从前 i 个数中挑选,最后一个位置的数必选,此时的最大和。
  • g[i]:从前 i 个数中挑选,最后一个位置的数不选,此时的最大和。

状态转移方程:

  • f[i] = g[i-1] + arr[i]
  • g[i] = max(f[i-1], g[i-1])

初始化:

  • f[0] = 0,g[0] = 0

二、代码

1、没看题解之前AC的代码

//一维dp-2个状态
#include <iostream>
using namespace std;
 
const int N = 2e5+10;
int a[N], f[N], g[N];
 
int main()
{
    int n;
    cin >> n;
    for(int i=1; i<=n; i++)
        cin >> a[i];
    for(int i=1; i<=n; i++)
    {
        f[i]=max(f[i-1], g[i-1]+a[i]);
        g[i]=max(f[i-1], g[i-1]);
    }
    cout << max(f[n], g[n]) << endl;
    return 0;
}
 
//一维dp-1个状态
#include <iostream>
using namespace std;
 
const int N = 2e5+10;
int a[N], dp[N];
 
int main()
{
    int n;
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> a[i];
    dp[0]=a[0], dp[1]=max(a[0], a[1]);
    for(int i=2; i<n; i++)
        dp[i]=max(dp[i-2]+a[i], dp[i-1]);
    cout << dp[n-1] << endl;
    return 0;
}
 
//力扣AC代码
//一维dp-2个状态
class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        vector<int> f(n+1);
        vector<int> g(n+1);
        for(int i=1; i<=n; i++)
        {
            f[i]=max(f[i-1], g[i-1]+nums[i-1]);
            g[i]=max(f[i-1], g[i-1]);
        }
        return max(f[n], g[n]);
    }
};
 
//一维dp-1个状态
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        if(n==1) return nums[0];
        vector<int> dp(n);
        dp[0]=nums[0], dp[1]=max(nums[0], nums[1]);
        for(int i=2; i<n; i++)
            dp[i]=max(dp[i-2]+nums[i], dp[i-1]);
        return dp[n-1];
    }
};

2、值得学习的代码

#include <iostream>
using namespace std;
 
const int N = 2e5 + 10;
 
int n;
int arr[N];
int f[N], g[N];
 
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> arr[i];
 
    for(int i = 1; i <= n; i++)
    {
        f[i] = g[i - 1] + arr[i];
        g[i] = max(f[i - 1], g[i - 1]);
    }
 
    cout << max(f[n], g[n]) << endl;
 
    return 0;
}

三、反思与改进

典型的 “打家劫舍” 系列问题,但我还是没能直接 AC,一直显示数组越界,我找了半天的边界,寻思着也没错,后来再仔细看题,发现数据范围看错了,晕这是什么低级错误!


相关文章
|
并行计算 Linux 计算机视觉
还在手工标注数据集?快来试一试自动化多模型标注大模型-gui交互式标注(部署运行教程-高效生产力)
还在手工标注数据集?快来试一试自动化多模型标注大模型-gui交互式标注(部署运行教程-高效生产力)
|
12月前
|
JSON API 开发者
百宝箱开放平台 ✖️ 发起知识库召回
开发者可通过调用该接口发起知识库召回,从海量数据中快速检索与查询相关的知识条目。需提供query、datasetId等参数,支持设置返回条数,默认5条,上限10条。
521 3
|
机器学习/深度学习 PyTorch 算法框架/工具
犬鼻纹识别是如何做到的?附代码示例
犬鼻纹识别技术利用深度学习与图像处理,通过手机等设备采集犬鼻图像,定位鼻纹关键点并提取有效区域。经灰度化、降噪等预处理后,输入残差卷积神经网络提取深度特征,形成代表犬鼻独特性的数值向量。最终,将特征与数据库比对,计算相似度完成识别。示例代码基于 PyTorch,包含数据预处理、模型训练及预测流程,实现高效精准的犬只身份认证。
1019 40
|
人工智能 搜索推荐
与李白赏图赋诗,同猴哥直面天命,人大高瓴提出MMRole多模态角色扮演
【10月更文挑战第7天】近年来,角色扮演代理(RPA)因传递情感价值和促进社会学研究而受到关注,但现有研究多局限于文本模态,未能模拟多模态感知。中国人民大学为此提出了MMRole框架,用于开发和评估多模态角色扮演代理(MRPA)。该框架包括MMRole-Data数据集与MMRole-Eval评估方法,并已取得初步成果。尽管存在数据集覆盖不全及评估方法局限等挑战,MMRole框架仍为MRPA的开发提供了新的方向,未来可在教育、娱乐和心理治疗等领域广泛应用。论文详情参见:https://arxiv.org/abs/2408.04203
300 1
|
IDE Java 测试技术
如何优雅地根治Java中Null值引起的Bug问题
【8月更文挑战第18天】在Java开发中,null 值是一个既常见又危险的存在。它常常是导致程序崩溃、难以调试的“罪魁祸首”。然而,通过一系列优雅的策略和实践,我们可以有效地减少甚至根除由 null 值引发的Bug。本文将从多个方面探讨如何做到这一点。
460 4
|
移动开发 文字识别 算法
视觉智能开放平台产品使用合集之如何集成到使用钉钉端的H5应用中
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
379 0
|
算法 C语言
【全栈计划 —— 单片机】——Part_01 单片机数字电路基础+C51基础概念(1)
【全栈计划 —— 单片机】——Part_01 单片机数字电路基础+C51基础概念(1)
502 0
【全栈计划 —— 单片机】——Part_01 单片机数字电路基础+C51基础概念(1)
|
15天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8182 18
|
14天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2402 13

热门文章

最新文章