动态规划--青蛙跳台阶

news2024/12/23 13:46:59

青蛙跳台阶

  • 前言
  • 青蛙跳台阶
    • 题目
    • 最优解结构性质
      • 画图分析
      • 发现规律
      • 验证规律
    • 动规表达式
      • 青蛙跳台阶
      • 与斐波那契数列的不同之处
    • 递归实现
      • 代码实现
      • 测试结果
      • 递归过程画图分析
    • 非递归实现
      • 代码实现
      • 对比分析

前言

斐波那契数列每次学都有不一样的体会,从最开始简单理解就是,一个找规律的游戏,就是更新数值,往后算就行了,但是,后来,用斐波那契数列理解递归算法,是一个很好的例子,由上向下计算,依次回溯,最后,没想到斐波那契数列还能和动态规划联系起来。当然,斐波那契数列也有很多的变式,青蛙跳台阶、兔子繁殖、将数字翻译成字符串等。只有将最基本的理解到位,后面的变式才能游刃有余的解决。

青蛙跳台阶

题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

最优解结构性质

画图分析

当只有1 2 3 节台阶的时候,我们可以直接画出来,比如2阶台阶时,有两种方法可以跳上去,每次跳1阶,跳两次,用11表示,或者直接跳2阶,用2表示
当有3阶台阶时有三种跳发,即 111 21 12
在这里插入图片描述

发现规律

对于3阶台阶,最后一步有两种跳发,跳一阶和两阶,
如果跳1阶,跳之前青蛙所处的位置在第2 阶台阶,只用跳一步就行,跳到第2阶台阶方法有11 2
在此基础上 就是 111 21
如果跳2阶,跳之前青蛙所处的位置在第1阶台阶,要想跳到顶部,有两个办法,要么一步一步跳,即 111,要么直接跳两步 即12 。即,111 12
可以看到,跳一阶和跳2阶,都有方法111 ,因为,在第1阶台阶时,你如果一步一步跳的话,你跳第一步的时候,你就变成了上一个情况(从第2阶台阶向上跳一步),所以这里,不能跳一步,只能跳两步,即12
所以总的跳法就是 111 21 12
这种求法是建立在第1阶和第2阶基础上来的。

在这里插入图片描述

验证规律

用1 2阶台阶推导第3阶的方法,根据2 3阶推导第4阶台阶。
到达第4阶台阶,要么从第3阶开始,就跳1步,要么从第2阶开始,跳2步,否则有重复
在这里插入图片描述

动规表达式

青蛙跳台阶

dp[i]表示到达第i阶台阶的跳法

dp[0]=1
dp[1]=1
dp[2]=2
dp[i]=dp[i-1]+dp[i-2]

与斐波那契数列的不同之处

可以先了解: 斐波那契数列的分析这样更好理解异同之处。
类似斐波那契数列,区别就是起始数字不同
斐波那契数列:0 1 1 2 3 5 …

dp[0]=0
dp[1]=1
dp[i]=dp[i-1]+dp[i-2]

递归实现

根据递归表达式,递归实现该算法

代码实现

#include<iostream>
#include<vector>
using namespace std;
int wayNums(int n) {
	if (n == 1|| n==0)return 1;
	return wayNums(n - 1) + wayNums(n - 2);
}
int main() {
	int num = wayNums(5);//8
	cout << num << endl;
	return 0;
}

测试结果

在这里插入图片描述

递归过程画图分析

即你需要算跳到第5阶台阶的值,首先需要4 3 的值,以此类推,逐步回溯
在这里插入图片描述
递归算法,自顶而下,算了许多的重复值,即 如图 wayNums(1)算了5次,wayNums(2)算了,3次,wayNums(3)算了2次。
我们用一个表记录重复的值,需要用的时候,我们在直接用,不用重新算了

非递归实现

根据已经有的值,自底而上,向上计算。

代码实现

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int>dp(6);
	dp[0] = 1;
	dp[1] = 1;
	for (int i = 2; i <= 5; i++) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}
	cout << dp[5] << endl;
	return 0;
}

对比分析

在这里插入图片描述

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

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

相关文章

无监督域适应 (UDA)(2)

本帖介绍UDA 的一个分支&#xff1a;bi-classifier adversarial learning。 一、回顾 在介绍 bi-classifier adversarial learning 之前&#xff0c;先来回忆一下 adversarial generation framework, 因为前者是基于后者的改进。 如图1所示&#xff0c;左边表示的是1&#xf…

DeepSORT 论文精读

摘要 SORT&#xff08;Simple Online and Realtime Tracking&#xff09; we integrate appearance information to improve the performance of SORT 集成外观信息来提高SORT的表现 we are able to track objects through longer periods of occlusions, effectively reduci…

JVM学习05:内存模型

JVM学习05&#xff1a;内存模型 1、java内存模型 很多人将java 内存结构与java 内存模型傻傻分不清&#xff0c;java 内存模型是 **Java Memory Model&#xff08;JMM&#xff09;**的意思。 JMM 定义了一套在多线程读写共享数据时&#xff08;成员变量、数组&#xff09;时…

UE4/5对背景音乐的调整设置

音乐是一个游戏必不可少的因素。 而在游戏设置中&#xff0c;必不可少的就有对背景音乐的声音大小进行设置&#xff0c;而我们需要的就是如何对背景音乐进行设置&#xff1a; 准备两个蓝图&#xff0c;分别是音效类和音效类混合。 然后打开音效类&#xff0c;我们可以看见下图…

如何用postman进行http接口测试,这篇文章绝对会颠覆你的认知

目录 前言 优点&#xff1a; 1、什么是POSTMAN 2、新建一个项目 2、新增一个用例 3、添加请求信息 4、post请求参数 5、添加头信息 6、预处理和结果检查 7、全局变量与环境变量 8、导出用例为代码 9、批量执行用例 前言 HTTP的接口测试工具有很多&#xff0c;可以进…

贪心法——黑白连线问题

一、问题描述 黑白连线Time Limit: 1000 MSMemory Limit: 1000 KB Description 给定直线上2n个点的序列P[1,2,… ,2n]&#xff0c;每个点P[i]要么是白点要么是黑点&#xff0c;其中共有n个白点和n个黑点&#xff0c; 相邻两个点之间距离均为1&#xff0c;请设计一个算法将每…

第六章:C语言的数组

在我的生活中&#xff0c;有许许多多的东西&#xff0c;有强迫症的小伙伴们&#xff0c;喜欢把它们分类到一个地方保存&#xff0c;这样一来&#xff0c;用的时候就按分类的形式来找自己需要的东西&#xff0c;而C语言也是如此&#xff0c;当有多个整形的数字是&#xff0c;就可…

steam搬砖详细解说,CSGO游戏搬砖的18个疑问?

看到这边文章进来的都是想了解steam搬砖&#xff0c;做个副业&#xff0c;我希望你可以认真把这个看完再考虑要不要做&#xff0c;适不适合自己去做&#xff0c;首先steam搬砖这个项目是需要有周转本金的&#xff0c;因为需要购买饰品道具&#xff0c;至于多少&#xff0c;这个…

7种《软件测试用例设计方法》解读及工作场景解析

1、等价类划分法 等价类划分法是一种将输入、输出、内部值等划分为若干个等价类的黑盒测试设计技术。在这种方法中&#xff0c;我们假设同一等价类的数据会被程序以相同的方式处理。 例如&#xff1a;一个允许输入年龄的程序&#xff0c;允许的年龄范围是1到100。在这种情况下…

Vue Test Utils前端单元测试

含义 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。在提供了经过测试的单元的情况下&#xff0c;系统集成过程将会大大地简化。流行框架 Mocha (https://mochajs.cn/)、Jest (https://www.jestjs.cn/) Mocha Chai…

asp.net web api 后端服务器在调试时跨域问题的解决方案

跨域在发布时&#xff0c;在iis设置中 https://www.cnblogs.com/babietongtianta/p/6488985.html 在开发调试时&#xff0c;program.cs中添加 和各种方法&#xff0c;都不可以。 后来在iisexpress中设置&#xff0c;解决了。 在右下角iisexpress 右键 双击打开applicationho…

PCL学习十:Segmentation-分割

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 PCL点云库学习笔记&#xff08;文章链接汇总&#xff09; 1. 引言 点云分割是根据空间、几何和纹理等特征对点云进行划分&#xff0c;使得同一划分区域内的点云拥有相似的特征。点云的有效分割往往是许多应用的前提&#…

【OAI】部署5GSA独立组网网络切片例程及例程解析

文章目录 摘要引言关键技术介绍5G核心网核心网网元功能 网络切片OAIDocker官方例程详解整体介绍具体详解网络切片架构部署概览与说明1-41.预先准备5.部署OAI 5G核心网6.获取基站仿真docker镜像7.部署基站仿真8.通信测试9.分析结果10. 使用多切片的UE11. 解除部署11.1解除RAN部署…

面了一个4年经验的测试员,一问三不知还反过来怼我?

金三银四期间&#xff0c;我们公司也开始大量招人了&#xff0c;我这次是公司招聘的面试官之一&#xff0c;主要负责一些技术上的考核&#xff0c;这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽&#xff1a;这几个星期没有哪天不加班的&#xff01;各种招…

(8)Qt---数据库

目录 1. Qt数据库简介 2. 连接与关闭 3. 建表 4. 增删改 5. 查询 6.银行管理系统程序代码(包含增删改查) 1. Qt数据库简介 Qt只是作为媒介去操作数据库&#xff0c;本身不具备数据库的功能&#xff0c;因此除了Qt以外&#xff0c;还需要在计算机中安装对应的数据库软件&#xf…

Windows 11 支持安卓应用

更改系统国家 打开windows自带的搜索&#xff0c;找到更改国家或地区。把地区改成美国。 开启电脑VT 不同电脑开启方式不一样&#xff0c;请搜索&#xff1a;xxx进入BIOS和xxx开启VT打开你电脑的VT。 安装子系统 电脑打开Microsoft Store直接搜是搜不到的&#xff0c; 点…

C/C++的内存管理

C/C的内存管理 1.C/C的内存分布2.C语言的动态内存管理方式&#xff1a;malloc/calloc/realloc/free3. C内存管理方式3.1. new/delete操作内置类型3.2.new和delete操作自定义类型 4.operator new与operator delete函数4.1 operator new与operator delete函数 5.new和delete的实现…

一次查找分子级Bug的经历,过程太酸爽了

“Debugging is like trying to find a needle in a haystack, except the needle is also made of hay.” Debug调试就像是在大片的干草堆中找针一样&#xff0c;只不过针也是由干草制成的。 在软件开发的世界里&#xff0c;偶尔会出现一些非常隐蔽的 Bug&#xff0c;这时候工…

数据结构之“树”——二叉树、红黑树、B树、B+树、B*树

这篇文章主要简单总结下二叉树、红黑树、B树、B树、B*树的基本结构和原理。 一、二叉树 二叉树就是度不超过2的树(每个结点最多有两个子结点)。 二叉树是有序树&#xff08;二叉排序树&#xff09;&#xff0c;若将其左右子树颠倒&#xff0c;则成为另一棵不同的二叉树。 二叉…

MYSQL跨服务器访问数据库 :FEDERATED存储引擎

当想从不同服务器的数据库获取数据时&#xff0c;我们会想到oracle的DBLink&#xff1b;sqlserver的链接访问&#xff08;傻瓜式操作&#xff0c;按照步骤配置即可&#xff09;&#xff0c;那么mysql有没有跨服务器访问的功能呢&#xff1f;答案自然是有的。 博主这就分享给大家…