代码随想录算法训练营第三十二天(动态规划 一)

news2024/9/18 11:31:43

前几天有点忙加上贪心后面好难QWQ 暂时跳过两天的贪心,开始学动归

动态规划理论基础:

文章链接:代码随想录

文章思维导图:

文章摘要:

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。

动态规划的解题步骤(动归五部曲)

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

一些建议与解惑   

一些同学可能想为什么要先确定递推公式,然后在考虑初始化呢?

因为一些情况是递推公式决定了dp数组要如何初始化!

做动归找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!

力扣题部分:

509. 斐波那契数

题目链接:. - 力扣(LeetCode)

题面:

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1。

给定 n ,请计算 F(n) 。

思路:

动归五部曲:

1.确定dp数组以及下标的含义

dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2.确定递推公式

递推公式题目直接给我们了,我们可以写出状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

3.dp数组如何初始化

同样也是直接由题目得出dp[0] = 0, dp[1] = 1。

4.确定遍历顺序

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

5.举例推导dp数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55

代码实现:

class Solution {
public:
    int fib(int n) {
        int dp[35];
        if(n == 0 || n == 1) return n;
        dp[1] = 1;
        for(int i = 2; i <= n; i ++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

70. 爬楼梯

题目链接:. - 力扣(LeetCode)

题面:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

思路:

动归五部曲:

1.确定dp数组以及下标的含义

dp[i]: 爬到第i层楼梯,有dp[i]种方法

2.确定递推公式

如何可以推出dp[i]呢?

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。

那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!

递推公式: dp[n] = dp[n - 1] + dp[n - 2];

3.dp数组如何初始化

回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]种方法

递推公式需要两个值,由题目不难得出 dp[1] = 1, dp[2] = 2。

4.确定遍历顺序

遍历顺序一定是从前向后遍历的,和上一题本质其实一样。

5.举例推导dp数组

1 2 3 5 8 13 21 34 55

不少人肯定看出来了,这不就是斐波那契数列么!

和上一题区别就是没前两个数组而已。

代码实现:

class Solution {
public:
    int climbStairs(int n) {
        int dp[50];
        if(n == 1 || n == 2) return n;
        dp[1] = 1, dp[2] = 2;
        for(int i = 3; i <= n; i ++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

746. 使用最小花费爬楼梯

题目链接:. - 力扣(LeetCode)

题面:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

思路:

动归五部曲:

1.确定dp数组以及下标的含义

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。

2.确定递推公式

可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]

dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

3.dp数组如何初始化

看一下递推公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。

题目说你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。也就是说到达 第 0 个台阶是不花费的,但从 第0 个台阶往上跳的话,需要花费 cost[0]。

所以初始化 dp[0] = 0,dp[1] = 0;

4.确定遍历顺序

因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。

今天的三道题好像这个步骤不需要思考,但随着后面的学习,我们会遇到需要在这块做文章的题目的。

5.举例推导dp数组

拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下:

代码实现:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int dp[1000] = {0};
        for(int i = 2; i < cost.size(); i ++)
        {
            dp[i] = min((dp[i - 1] + cost[i - 1]), (dp[i - 2] + cost[i - 2]));
            //cout<<dp[i]<<" ";
        }
        int ans = min(dp[cost.size() - 1] + cost[cost.size() - 1], dp[cost.size() - 2] + cost[cost.size() - 2]);
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运动耳机哪个牌子的好?五大口碑爆棚的骨传导运动耳机全方位分析

随着健康意识的提高和运动文化的普及&#xff0c;越来越多的人开始注重运动时的舒适度和体验感。在众多运动装备中&#xff0c;耳机作为不可或缺的一部分&#xff0c;其选择对运动体验有着直接的影响。传统的入耳式耳机在运动时可能会因为汗水、滑落等问题影响使用体验&#xf…

‘聊天不要太正经,越调戏对方越爱你的搞笑句子’

01 02 03 04 05 06 07 免费小程序《字形绘梦》上线啦&#xff01; 欢迎大家体验&#xff01;

自动驾驶技术软件教学平台

1、基本介绍 自动驾驶技术软件教学平台是中智讯公司开发的一款面向人工智能相关专业自动驾驶方向的综合型实验平台&#xff0c;主要满足&#xff1a;机器人控制技术、机器人操作系统、机器视觉技术、机器语言技术、智能边缘计算、人工智能中间件、机器人协作、SLAM导航等课程的…

餐饮行业的数字化转型——霸王餐API接口对接

霸王餐API接口对接对餐饮行业的数字化转型具有显著的推动作用&#xff0c;其关键优势和特点包括&#xff1a; 提升运营效率&#xff1a;通过自动化管理&#xff0c;减少人工操作&#xff0c;提高工作效率和减少错误。优化消费者体验&#xff1a;提供实时的菜品信息、下单和支付…

《软件工程导论》(第6版)第9章 面向对象方法学引论 复习笔记

第9章 面向对象方法学引论 一、面向对象方法学概述 1&#xff0e;要点 面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。 &#xff08;1&#xff09;基本原则 面向对象方法学的出发点和基本原则&#xff0c;是尽可能模拟人…

NPDP|如何在传统行业中做好产品管理的策略与建议

在当今这个快速变化的数字时代&#xff0c;传统行业面临着前所未有的挑战与机遇。产品管理作为连接市场需求与企业生产的核心环节&#xff0c;其重要性不言而喻。对于传统行业而言&#xff0c;做好产品管理不仅意味着保持竞争力&#xff0c;更是实现转型升级、拥抱未来的关键。…

MATLAB进行天线阵列方向图综合

摘要&#xff1a;本次推文将介绍如何利用MATLAB的Sensor Array Analyzer进行天线阵列的方向图综合。 1. 阵列方向图综合理论 对于均匀平面阵列而言&#xff0c;其阵因子公式可以写成 当阵列是三角网格布置或者圆环阵时&#xff0c;《ANTENNA THEORY ANALYSIS AND DESIGN》等相…

前端跨域问题详解与解决方案指南

什么是跨域问题 跨域问题通常是由浏览器的同源策略&#xff08;Same-OriginPolicy&#xff0c;SOP&#xff09;引起的访问问题 同源策略是浏览器的一个重要安全机制&#xff0c;它用于限制一个来源的文档或脚本如何能够与另一个来源的资源进行交互 同源策略的定义 同源策略要…

【MySQL_JDBC】Day23-Day28 数据库基础、JDBC基础、聊天室3.0

数据库 数据库基本概念 数据库DataBase 定义: 保存数据的仓库就称为数据库 例如 编写一个用户管理系统&#xff0c;可以让用户在我们编写的系统上进行注册等操作&#xff0c;此时就涉及到了保存用户数据的操作&#xff0c;目前我们的做法可以将一个用户信息以一个User对象…

【精选】大型体育场管理系统的设计与实现(全网最新定制,独一无二)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Unity(2022.3.41LTS) - UI详细介绍-Dropdown(下拉列表)

目录 零.简介 一、基本功能与用途 二、组件介绍 三、使用方法 四、优化和注意事项 五.代码实例 零.简介 在 Unity 中&#xff0c;下拉列表&#xff08;Dropdown&#xff09;是一种常用的 UI 组件&#xff0c;用于提供一组选项供用户选择。 一、基本功能与用途 选项选择…

【出行计划 / 2】

题目 思路 暴力 O ( m ⋅ n ) O(m \cdot n) O(m⋅n) \;\;\;\;\; 不可行 树状数组差分 O ( m ⋅ l o g ( 5 e 5 ) ) O(m \cdot log(5e^{5})) O(m⋅log(5e5)) \;\;\;\;\; 可行 具体思路&#xff1a; t [ i ] ∈ [ q k − c [ i ] 1 , q k ] t[i] \in [qk-c[i]1, \;qk…

stm32的内部时钟源 | RC震荡电路

文章目录 前言学习了解 前言 了解到 内部高速RC振荡器&#xff08;HSI&#xff09;就是RC震荡器实现的&#xff0c;故想对RC震荡做些了解与分析。 学习了解 【不需要晶振&#xff0c;也可产生时钟脉冲&#xff01;RC振荡器的工作原理&#xff0c;维恩电桥振荡器&#xff01;…

电脑连接公司服务器记住了账户密码,怎么换账户呢?

今天&#xff0c;有同事找到我&#xff0c;说共享连不上去了&#xff0c;我去试了下&#xff0c;知道了原因&#xff1a;由于我将之前使用这台电脑的人的账户在后台禁用了&#xff0c;所以这台电脑连不上服务器了&#xff0c;也不是连不上&#xff0c;而是之前是记住了账户密码…

基于vue框架的超市商品管理系统m9o29(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;商品信息,商品分类,进货入库,员工,销售出库 开题报告内容 基于Vue框架的超市商品管理系统开题报告 一、研究背景与意义 在快速变化的零售市场中&#xff0c;超市作为商品销售的重要渠道&#xff0c;其商品管理效率直接影响到顾客满意…

dbeaver配置hive连接

环境 os: windows 11 dbeaver: 22.3.1 hive: version&#xff1a; apache-hive-3.1.2 配置dbaeaver hive driver 点击编辑驱动设置 1、删除默认驱动配置 2、添加hive 安装文件 jdbc 中驱动文件 3、点击找到类 &#xff0c;配置正确跳出驱动类 4、确认 点击测试链接 成功之后…

从源码开始:打造智能化食堂采购与供应链管理平台

随着食堂规模的扩大和供应链的复杂化&#xff0c;这些问题更加突出。智能化的食堂采购平台可以通过自动化流程、数据分析和智能推荐&#xff0c;显著提高采购效率&#xff0c;减少浪费&#xff0c;并降低运营成本。 要打造这样一个平台&#xff0c;首先需要对食堂的日常运营需…

基于三维视频融合技术的矿山视频监控系统

传统矿山视频监控存在视频数据量大&#xff0c;视频图像之间关联性差&#xff0c;缺乏与三维空间位置信息的直接联动等问题&#xff0c;监管人员在面对多个碎片化的监控视频图像时难以有效复现场景及位置&#xff0c;这使得突发事件发生时不能及时解决相关问题&#xff0c;严重…

台球助教系统源码开发的发展前景

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级的应用形态&#xff0c;逐渐成为连接线上线下服务的重要桥梁。在体育领域&#xff0c;特别是像台球这样的精细运动项目中&#xff0c;小程序的应用为运动员提供了更为便捷的学习和训练手段。本文将探讨台球助教系统小…

【 OpenHarmony 4.1 Launcher 源码解析 】-- 初体验

前言 最近因为业务需要&#xff0c;需要做一款 UI 定制的鸿蒙 Launcher&#xff0c;于是就开始了「找到代码」、「研究代码」、「魔改代码」的套路流程&#xff0c;仅以此文章作为知识备份和技术探讨所用&#xff0c;也希望能给其他小伙伴提供一些源码的解析思路&#xff0c;方…