C/C++ 动态规划 算法

news2024/11/14 10:24:48

动态规划算法,以最小的消耗解题!

以一个走楼梯为例子展开。

假设有一个三级台阶,我们一次可以走一步,或者一次走两步,那么由此可知,一共有3中走法,如下图

当台阶数量少的时候,确实很容易解出来;那如果台阶数量是5呢,是10呢,是20呢。。。

这样复杂程度就蹭蹭蹭的放上涨了,这时就很那靠脑力算出来,所以得靠程序算法去求解。

可以使用递归的思维去求解!

从上往下分析问题,大问题可以分解为子问题,子问题中还有更小的子问题

比如总共有 5 级台阶,求有多少种走法;由于一次可以走两级台阶,也可以走一级台阶,所以我们可以分成两个情况

  • 最后一次走了两级台阶,问题变成了“走上一个 3 级台阶,有多少种走法?”
  • 最后一步走了一级台阶,问题变成了“走一个 4 级台阶,有多少种走法?”

我们将求 n 级台阶的共有多少种走法用 f(n) 来表示,则 f(n) = f(n-1) + f(n-2);

由上可得

f(5) = f(4) + f(3);

f(4) = f(3) + f(2);

f(3) = f(2) + f(1);

边界情况分析

走一步台阶时,只有一种走法,所以 f(1)=1

走两步台阶时,有两种走法,直接走 2 个台阶,分两次每次走 1 个台阶,所以 f(2)=2

走两个台阶以上可以分解成上面的情况

所以使用递归实现代码如下:

int WalkCount(int n) {

	if (n <= 0) return 0;

	if (1 == n) {	// 一级台阶,一种走法
		return 1;

	} else if (2 == n) {

		return 2;	// 二级台阶,二种走法
	}

	// f(n) = f(n-1) + f(n-2);
	return WalkCount(n - 1) + WalkCount(n - 2);
}

编写main方法进行测试:

int main(void) {

	int n = 0;

	printf("请输入台阶的级数:");
	scanf_s("%d", &n);

	for (int i = 0; i <= n; i++) {
		printf("走 %d 级台阶共有 %d 当中走法!\n", i, WalkCount(i));
	}	

	return 0;
}

编译输出:

 确实可以计算出来,但这种方式有种问题!

细心的朋友是否会注意到,上面的代码中存在很多重复的计算?

比如: f(5) = f(4) + f(3)

计算分成两个分支:

f(4) = f(3)+f(2) = f(2) + f(1) + f(2);

f(3) = f(2) + f(1);

上面阴影的部分就是重复计算的一部分!

有没有办法避免重复计算的部分?

其实我们可以从下向上分析推断问题。

f(1) = 1 f(2) = 2

f(3) = f(1) + f(2) = 3

f(4) = f(3) + f(2) = 3 + 2 = 5

f(5) = f(4) + f(3) = 5 + 3 = 8

依次类推 ...

我们可以不使用递归,从下往上进行分析推断问题,可以定义一个数组将之前计算好的数据保存下来,等到上面需要使用时,直接提取出来计算即可!

实现代码如下:

long long WalkCount2(int n) {

	if (0 >= n) return 0;
	if (1 == n) return 1;
	if (2 == n) return 2;

	long long *arr = (long long *)malloc(sizeof(long long)*(n + 1));
	memset(arr, 0, sizeof(n)*(n + 1));

	*(arr + 0) = 0;		// arr[0] = 0;
	*(arr + 1) = 1;		// arr[1] = 1;
	*(arr + 2) = 2;		// arr[2] = 2;

	for (int i = 3; i <= n; i++) {
		// arr[3] = arr[i-1] + arr[i-2];
		*(arr + i) = *(arr + (i-1)) + *(arr + (i-2));
	}

	long long ret = *(arr + n);
	
	free((void *)arr);
	return ret;
}

使用以下代码进行测试:

int main(void) {

	int n = 0;

	printf("请输入台阶的级数:");
	scanf_s("%d", &n);

	for (int i = 0; i <= n; i++) {
		printf("走 %d 级台阶共有 %lld 当中走法!\n", i, WalkCount2(i));
	}
	
	return 0;
}

运行截图:

可以很快速的计算出来。

还可以计算更大的数据,例如1000次,只要计算的数据long long类型可以存储,那么都是可以很快的计算出来,但如果是递归,则需要花费很多时间,因为他在做重复的计算工作!


动态规划算法实现就是类似这样;当然并不是所有的递归都可以使用动态规划算法来实现,得要有重复计算的才可以!

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

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

相关文章

MPViT : Multi-Path Vision Transformer for Dense Prediction

MPViT : Multi-Path Vision Transformer for Dense Prediction一、引言&#xff08;一&#xff09;、Vision Transformers for dense predictions&#xff08;二&#xff09;、Comparison to Concurrent work二、实现细节&#xff08;一&#xff09;、Multi-Path Vision Transf…

C#【必备技能篇】使用GDI绘制进度条的代码实现

文章目录一、使用“用户控件”生成圆环进度条的dll1、使用VS2019新建项目&#xff08;类库&#xff09;2、添加用户控件3 、用户控件PercentStar.cs源码编写二、引用dll&#xff0c;在Winform中代码实现1、新建Windows窗体应用&#xff08;.NET Framework&#xff09;2、添加引…

Java项目:ssm房屋租赁管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为管理员与租户2种角色&#xff1a; 管理员主要功能包括&#xff1a; 登录、查看房源信息、添加房源、查看租赁情况、合同查看、看房申…

皓量科技入选《中国数字营销生态图2022版》4大赛道!

11月28日&#xff0c;由中国商务广告协会数字营销专业委员会、虎啸奖组委会及秒针营销科学院三方合作出版的《中国数字营销生态图2022版》正式发布&#xff08;以下简称生态图&#xff09;。皓量科技凭借多年深耕程序化广告领域的实力与经验&#xff0c;在全行业服务商的征集调…

Codeforces Round #752 (Div. 1) B. Moderate Modular Mode

翻译&#xff1a; 谁有两个偶数&#x1d465;和&#x1d466;。帮助他找到一个整数&#x1d45b;&#xff0c;使1≤&#x1d45b;≤2⋅1018&#xff0c;且&#x1d45b;mod&#x1d465;&#x1d466;mod&#x1d45b;。这里&#xff0c;&#x1d44e;mod&#x1d44f;表示&am…

夯实算法-整数转罗马数字

题目&#xff1a;LeetCodeLeetCode 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D …

Linux操作系统~匿名管道和命名管道的使用及其原理分析

目录 1.匿名管道 &#xff08;1&#xff09;.匿名管道的原理 &#xff08;2&#xff09;.pipe接口的使用 如果只写不读&#xff08;求管道的大小&#xff09; &#xff08;3&#xff09;.匿名管道五个特点 &#xff08;4&#xff09;.匿名管道的四种情况 3.命名管道 &a…

世界杯之用Java实现随机胜平负

一、本章猜测随机数首先需要用到Scanner语句&#xff0c;对用户需要几组胜平负数量进行猜测&#xff0c;说动用到几组肯定要用到for循环了&#xff0c;还有要实现随机&#xff0c;就需要用到Math方法&#xff0c;进行随机抽取。 1.Scanner 首先使用Scanner语句抓取用户…

MATLAB算法实战应用案例精讲-【工具篇】运筹优化工具OR-TOOLS(补充篇)(附实战案例及代码实现)

前言 本文为【工具篇】运筹优化工具OR-TOOLS(附实战案例及代码实现)的补充篇。 OR-Tools是一个用于优化的开源软件套件,用于解决车辆路径、流程、整数和线性规划以及约束编程等世界上最棘手的问题。同时OR-Tools提供了C++,Python,Java,.NET的接口,同时提供统一接口封装来…

为你揭秘拼购为什么是破产老板手中的最后一根稻草?

拼购&#xff0c;已经成为了电商平台自主传播的一种营销活动&#xff0c;通过拼团可以促成更多的成交量&#xff0c;但拼团也不是这样简单的放在那里就能有客户进来参与&#xff0c;其中还有很多细节上面的地方需要我们好好探究。这个拼购模式和我们之前见过的拼多多拼团、拼购…

什么蓝牙耳机适合realme手机?适合realme手机的高端蓝牙耳机推荐

根据网络调查数据显示&#xff0c;市面上的耳机需求量在不断增加&#xff0c;随着智能手机的普及&#xff0c;耳机作为炙手可热的产品&#xff0c;尤其是网易云、全民K歌&#xff0c;直播的流行&#xff0c;消费者对于耳机的需求不仅仅是听歌了&#xff0c;有线耳机也逐渐被无线…

【Matplotlib绘制图像大全】(五):饼图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

风靡互联网关键词 Web3.0 | 区块链 | 比特币 | 元宇宙……

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Web web是互联网的总称&#xff0c;全称为World Wide Web&#xff0c;缩写WWW &#xff0c;即全球广域网&#xff0c;也称为万维网&#xff0c;它是一种基于超文本和H…

007.复原 IP 地址

1.题目链接&#xff1a; 93. 复原 IP 地址 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给定一串只包含数字的字符串s&#xff0c;返回所有让 s 构成 有效IP地址 的数字组合。 有IP地址&#xff1a; 4个 [0,255] 范围内的数字 组成&#xff0c;并且整数之间用 " …

绿源:“老大哥”冲刺IPO,新的故事如何讲?

又一家老牌电动两轮车企业“开”向了资本市场。 11月22日&#xff0c;绿源集团控股&#xff08;开曼&#xff09;有限公司&#xff08;以下简称“绿源集团”&#xff09;正式向港交所递交招股说明书&#xff0c;拟主板挂牌上市&#xff0c;中信建设国际担任独家保荐人&#xf…

ctfshow node.js专题

文章目录web334web335web336web337web338web339web340web341web342、web343web334 给了附件&#xff0c;然后进入后发现是一个登录框。 在附件中知道了账号密码&#xff0c;但是却无法登录。 先看user从哪里获取&#xff1a; var user findUser(req.body.username, req.bod…

虹科案例 | 订单自动分拣效率居然这么高?

Background 背景 过去&#xff0c;一家自动仓储和检索系统&#xff08;AS/RS&#xff09;梭子解决方案的制造商依靠车轮编码器来指示梭子沿轨道的位置。虽然这种解决方案已经使用了多年&#xff0c;也将继续使用&#xff0c;但它可能容易出现定位错误&#xff0c;这通常是由车…

[附源码]Python计算机毕业设计SSM考勤管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Kotlin高仿微信-第35篇-支付-二维码收款(二维码)

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

【python可视化】python编码规范、标准库与扩展库对象的导入与使用

&#x1f64b;‍ 哈喽大家好&#xff0c;本次是python数据分析、挖掘与可视化专栏第一期 ⭐本期内容&#xff1a;python编码规范、标准库与扩展库对象的导入与使用 &#x1f3c6;系列专栏&#xff1a;Python数据分析、挖掘与可视化 &#x1f44d;欢迎大佬指正&#xff0c;一起学…