【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)

news2024/11/27 8:39:56

目录

写在前面:

题目:821. 跳台阶 - AcWing题库

题目描述:

输入格式:

输出格式:

数据范围:

输入样例:

输出样例:

解题思路:

方法一:暴力搜索

代码

方法二:记忆化搜索

代码

方法三:动态规划

 代码

AC !!!!!!!!!!

写在最后:


写在前面:

怎么样才能学好一个算法?

我个人认为,系统性的刷题尤为重要,

所以,为了学好动态规划,应对 “DP杯”。

事不宜迟,我们即刻开始刷题!

题目:821. 跳台阶 - AcWing题库

题目描述:

一个楼梯共有 n 级台阶,每次可以走一级或者两级,

问从第 0 级台阶走到第 n 级台阶一共有多少种方案。

输入格式:

共一行,包含一个整数 n。

输出格式:

共一行,包含一个整数,表示方案数。

数据范围:

1 ≤ n ≤ 15

输入样例:

5

输出样例:

8

解题思路:

这道题是一道经典的dp入门题目,

我打算使用三种方法去做,层层推进,一起入门递归:

方法一:暴力搜索

这道题在之前dfs的刷题中也有出现,

我们可以用dfs搜索所有的方案:

跳三级台阶就是跳两级台阶的方法+跳一级台阶的方法;

跳四级台阶就是跳三级台阶的方法+跳二级台阶的方法;

以此类推: 

最后得出答案:

代码如下:

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n = 0;

int dfs(int u)
{
    if(u == 1) return 1;
    else if(u == 2) return 2;
    
    return dfs(u - 1) + dfs(u - 2);
}

int main()
{
    scanf("%d", &n);
    int res = dfs(n);
    printf("%d", res);
    return 0;
}

方法二:记忆化搜索

实际上第一种方法的时间复杂度太高,

有2的n次方那么大:

如果n >= 42,就会超时:

 

为了减少时间的消耗,我们可以用记忆化搜索:

将已经求过的值记录到一个数组中,

这样搜索过的值就不用重复搜索:

 下面是代码实现:

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n = 0;
int sum = 0;
const int N = 30;
int mem[N];//用一个数组记录

int dfs(int u)
{
    if(mem[u]) return mem[u];//如果记录过,就不用往下搜索了
    
    if(u == 1) return 1;
    else if(u == 2) return 2;
    else sum = dfs(u - 1) + dfs(u - 2);
    
    mem[u] = sum;//将该位置的值记录进数组
    return mem[u];
}

int main()
{
    scanf("%d", &n);
    int res = dfs(n);
    printf("%d", res);
    return 0;
}

我们发现这样之后,就算n = 100,也只需要1ms:

方法三:动态规划

我们发现,其实这道题动态规划的

状态表达式就是由暴力搜索推出来的,

递归搜索是从上往下搜索,

再从下往上回溯,

其实得出的结果的过程就是在回溯的时候:

那我们可以不用搜索这个过程,直接从下往上递推,

这就是动态规划:

下面是代码实现:

 代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n = 0;
const int N = 30;
int fib[N];

int main()
{
    scanf("%d", &n);
    
    fib[1] = 1;
    fib[2] = 2;
    
    if(n == 1 || n == 2)
    {
        printf("%d", fib[n]);
        return 0;
    }
    
    for(int i = 3; i <= n; i++)
    {
        //这个就是动态规划的状态表达式
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    printf("%d", fib[n]);

    return 0;
}

AC !!!!!!!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

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

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

相关文章

chatgpt赋能Python-pandas_归一化

Pandas归一化是什么&#xff1f; 数据归一化是数据预处理中的一个重要步骤&#xff0c;它能够将不同范围的数值转化为相同的数值范围。Pandas是一种数据处理工具&#xff0c;因此它提供了许多函数来实现数据归一化。其中最常用的函数是Normalization。 Normalization函数的使…

树形结构数据扁平化js方法

最近在公司项目中遇到树形结构数据,在进行遍历查找指定的数据的时候一搬进行递归调用的查询,因为递归是效率很慢的方式,尤其是在数据量特别大的时候是及其浪费性能,所以我想了一个树形结构扁平化的方法,代码如下: /**** param {Array} arrs 树形数据* param {string} childs 树…

Java面向对象程序设计实验报告(实验五 接口的练习)

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录&#xff1a;源程序代码&#xff08;带注释&#xff09; demo5类 Instrument类 Piano类 …

SpringSecurity入门

SpringSecurity 为什么要有SpringSecurity&#xff1f;SpringSecurity入门案例SpringSecurity基本原理SpringSecurity两个重要接口 SpringSecurity-web权限方案认证整合数据库 为什么要有SpringSecurity&#xff1f; 正如你可能知道的关于安全方面的两个主要区域是“认证”和“…

Linux:如何在虚拟机中装配JDK 与Tomcat服务器?【2023最新版】

Linux系统版本&#xff1a;centos 7.5 x64位 VMware版本&#xff1a; VMware Workstation Pro 16 Xshell工具版本&#xff1a;Xshell 7 &#xff08;for home and free&#xff09; Xftp工具版本&#xff1a;Xftp 7 &#xff08;for home and free&#xff09; 文章目录 一、如…

chatgpt赋能Python-pycharm_python版本切换

Pycharm Python版本切换指南 作为广受欢迎的Python IDE之一&#xff0c;Pycharm 提供了快捷的Python版本切换功能以适应不同的项目需求。本文将为您介绍如何在Pycharm 中进行Python版本切换&#xff0c;并解答一些与版本兼容性相关的常见问题。 如何在Pycharm中进行Python版本…

E6—4路GTX实现40G光纤通信2023-05-17

1.场景 从发送端&#xff08;一块硬件板卡&#xff09;通过40G QSFP接光纤连接到接收端&#xff08;另一块硬件板卡&#xff09;&#xff0c;实现从数据的发送与接收。连接如下&#xff0c;官方的example design即可实现这一功能&#xff0c;因此直接使用官方的代码即可。 2.硬…

【Redis】聊一下RDB持久化机制

上一篇文章中&#xff0c;AOF虽然可以通过重写机制减少AOF文件的大小&#xff0c;但是AOF数据恢复的时候依然是一个很耗费时间的操作&#xff0c;那么也就是不能够快速的进行数据的恢复&#xff0c;RDB正好可以解决这个问题。 RDB RDB&#xff08;Redis 数据库&#xff09;&a…

深度学习用于医学预后-第二课第四周5-10节-为个体患者制定风险评估模型

文章目录 相对风险按风险对患者进行排序个体与基线风险吸烟者与不吸烟者年龄对风险的影响 在本课中&#xff0c;您将学习 Cox 比例风险模型(Cox Proportional Hazards Model)。您将了解 Cox 模型如何考虑患者变量来比较不同患者的风险&#xff0c;使用他们的患者概况。 但到目前…

“出圈”警博会,欧科云链推动链上合规监管进程

5月13日&#xff0c;在由公安部主办的第11届中国国际警用装备博览会&#xff08;下简称“警博会”&#xff09;上&#xff0c;欧科云链接受中国警察网邀请&#xff0c;展开了“链上天眼科技助警”成果分享会&#xff0c;分享欧科云链持续创新应用区块链技术助力智慧警务的成果。…

chatgpt赋能Python-pandas_错位相减

Pandas&#xff1a;错位相减的重要性 如果你使用pandas进行数据处理&#xff0c;在一些数据分析的场景中你必须要逐行遍历并做一些数学计算&#xff0c;譬如你想要计算数据集中的同一列中相邻行之间的差异或“错位相减”以获得新的数据列。这在分析股票价格、交易和其他时间序…

nodejs 框架选型express koa egg midwayjs nestjs 对比

最近要做个开源项目&#xff0c;又要写node 工程&#xff0c;之前用的是koa 框架&#xff0c;最近看到了nestjs egg midwayjs 等框架一时间难以抉择。 人工智能的答案 文心一言 midwayjs 还写错了&#xff0c;感觉的很少&#xff0c;最后总结等于白说各有千秋。 chatgpt 好…

【Linux】7. 进程概念

在进程的学习之前首先需要理解并掌握冯诺依曼体系结构及操作系统的相关概念 1. 冯诺依曼体系结构 最终我们得到的结论是&#xff1a; 在数据层面上 CPU不与外部设备进行交互&#xff0c;而是直接和内存交互所有的外部设备需要数据载入&#xff0c;只能载入到内存中。数据从内…

相见恨晚的Matlab编程小技巧(3)-程序运行太慢了咋解决——合理使用循环语句(1)

相信大家在使用matlab时候经常会收到程序运行太慢的困扰&#xff0c;当程序比较复杂时&#xff0c;常常需要很长时间等待。我有个朋友就是这样&#xff0c;每次debug都要很长时间&#xff0c;等着的时候就想耍会手机&#xff0c;结果耍完一抬头发现程序运行结束了&#xff0c;但…

利用废旧手机搭建一台属于自己的服务器

1. Termux —— 手机终端模拟器App 1.1 使用F-Droid应用商店安装Termux # F-Droid 下载地址&#xff1a;https://f-droid.org/packages/com.termux/ 1.2 使用Termux安装环境 在手机上打卡Termux软件&#xff08;操作很不方便&#xff09;&#xff0c;后面介绍使用ssh服务通过…

基于ARIMA-LSTM组合模型的预测方法研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Vector - CAPL - CANoe DBC消息相关自动化_02

目录 GetMessageID -- 获取报文ID​编辑 代码示例 GetMessageName -- 获取报文名称 代码示例 getNextCANdbFilename -- 获取指定位置数据库文件命名 代码示例 getNextCANdbName -- 获取指定数据库的名称 代码示例 setSignalStartValues -- 设置目标信号初始值 代码示例…

计算机网络知识点大全

文章目录 1 计算机网络概述1.1.1 概念、组成、功能和分类1.1.2 标准化工作及相关组织1.1.3 速率相关的性能指标1.1.4 时延、时延带宽积、往返时间RTT、利用率1.2.1 分层结构、接口、协议、服务1.2.2 OSI参考模型1.2.4 TCP/IP与五层参考模型 第一章知识大纲2.物理层2.1 物理层基…

Docker实用篇

文章目录 Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安…

vue3的push问题

今天在处理动态数据时&#xff0c;使用push方法像数组中添加数据&#xff0c;会导致数组中所有参数都发生变化&#xff0c;解决方法可以搜到很多&#xff0c;这里使用的是如下的方法&#xff1a; 需要注意的是&#xff0c; 在push的时候需要newVal_value才能获取到深拷贝的值