【动态规划】C++解决斐波那契模型题目(三步问题、爬楼梯、解码方法...)

1. 前言 - 介绍动态规划算法

动态规划(Dynamic Programming,简称DP) 是一种解决复杂问题的算法设计技术,通常用于解决具有重叠子问题最优子结构性质的问题。它将问题分解成较小的子问题,通过解决这些子问题并保存其结果,最终构建出原问题的解。

  1. 重叠子问题(Overlapping Subproblems):问题可以被分解为相同的子问题,并且这些子问题在求解过程中会被多次重复计算。

  2. 最优子结构(Optimal Substructure):问题的最优解可以由其子问题的最优解来构造。


1.5 例题

我们通过下面的例题对动态规划算法进行理解

第N个泰波那契数

在这里插入图片描述

动态规划算法一般分为以下几个步骤:

  1. 定义状态表示:确定问题的状态,即 dp表中值所表示的含义
  • 如何找?
    • 根据 题目要求 + 做题经验
      • 本题要求第n个泰波纳契的值,我们就令dp[i]为第i个泰波纳契的值
  1. 确定状态转移方程:即 求dp[i]的公式

    • 根据题目所给的信息,我们知道dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
  2. 初始化 初始化边界状态,保证填表的时候不发生越界等问题

    • 由于我们需要用到i-1 到 i-3的下标,这里初始化前三个数
    • dp[0] = 0, dp[1] = dp[2] = 1;
  3. 填表的顺序 根据状态转移方程,会有不同的填表顺序

    • 对于本题来说,只需要从左向右填表。
  4. 返回值 根据题目要求与dp表的状态表示,写返回值

    • 题目要第n个泰波纳契值,而dp[i]表示第i个,所以返回dp[n];

根据上面的思路可以直接创建一个dp表并进行初始化与填表,代码都在思路中,对于本题,可以直接进行空间优化。

由于每次只需要记录三个值,可以直接使用变量代替dp表,滚动数组的思想,每次统计值后向右移动:

代码

int tribonacci(int n) {// 空间优化:变量代替数组// 处理边界问题if(n == 0)  return 0;else if(n == 1 || n == 2)   return 1;int a = 0, b = 1, c = 1, d = 0;for(int i = 3; i <= n; ++i) // 根据性质{d = a + b + c;a = b, b = c, c = d; // 数组向后滑动}return d;
}

动态规划算法的优点在于它可以避免重复计算,提高算法效率。然而,动态规划并不适用于所有问题,它要求问题具有重叠子问题和最优子结构性质,有时候贪心更适合解一定的题目。


2. 算法题

有了上面例题的经验,我们对动态规划有了一定的了解,下面进行正式的解题(斐波那契模型):

2.1 三步问题

在这里插入图片描述

思路

  • 解法动态规划 + 设置dp数组
    在这里插入图片描述

  • 根据之前的经验,我们分步进行题目解析:

在这里插入图片描述

代码

根据上面的思路进行代码的编写:

int waysToStep(int n) {vector<int> dp(n + 1);// 处理边界问题if(n == 1 || n == 2) return n;else if(n == 3) return 4;dp[1] = 1, dp[2] = 2, dp[3] = 4;const int MOD = 1e9 + 7;// 总结规律:// dp[i] = dp[i-1] + dp[i-2] + dp[i-3]for(int i = 4; i <= n; ++i){dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3]) % MOD;}return dp[n];
}

2.2 使用最小花费爬楼梯

在这里插入图片描述

思路

在这里插入图片描述

代码

  • 解法一:该解法为上图的思路代码
int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();// dp[i]: 到达第i阶楼梯 所花费的最小数目vector<int> dp(n + 1); // 默认为0for(int i = 2; i <= n; ++i){dp[i] = min(dp[i-1], dp[i-2]) + cost[i];}return dp[n];
}
  • 解法二:该解法的状态表示在代码注释中
int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n); // 默认为0// dp[i]: 从第i阶开始到达楼顶的最小花费dp[n-1] = cost[n-1]; dp[n-2] = cost[n-2];for(int i = n - 3; i >= 0; --i){dp[i] = cost[i] + min(dp[i+1], dp[i+2]);}return min(dp[0], dp[1]);
}

2.3 解码方法

在这里插入图片描述

思路

  1. 首先找到状态表示,列出状态转移方程

在这里插入图片描述

  1. 对于初始化,需要注意:

在这里插入图片描述

  1. 当正确开辟虚拟空间并初始化后,剩下就仅需填表即可(此时较为繁琐的初始化步骤就一并放到了填表操作):

在这里插入图片描述

代码

class Solution {
public:int numDecodings(string s) {// 优化:利用虚拟空间int n = s.size();vector<int> dp(n + 1); // 状态方程// 1. 初始化状态方程元素dp[0] = 1;dp[1] = s[1-1] != '0';// 2. 填表for(int i = 2; i <= n; ++i){if(s[i - 1] != '0') dp[i] += dp[i-1];int tmp = (s[i-2] - '0') * 10 + (s[i - 1] - '0');if(tmp >= 10 && tmp <= 26) dp[i] += dp[i-2];}// 返回值return dp[n];}
};

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

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

相关文章

NFTScan | 04.08~04.14 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.04.08~ 2024.04.14 NFT Hot News 01/ 数据&#xff1a;Runestone 地板价突破 0.07 BTC&#xff0c;创历史新高 4 月 8 日&#xff0c;据数据显示&#xff0c;Runestone 地板价突破 …

阿里面试:DDD中的实体、值对象有什么区别?

在领域驱动设计&#xff08;DDD&#xff09;中&#xff0c;有两个基础概念&#xff1a;实体&#xff08;Entity&#xff09;和值对象&#xff08;Value Object&#xff09;。 使用这些概念&#xff0c;我们可以把复杂的业务需求映射成简单、明确的数据模型。正确使用实体和值对…

Java详解:GUI容器组件 | 功能组件

✎ 简介&#xff1a; Graphical User Interface&#xff08;GUI&#xff09;图形用户界面 图形界面对于用户来说在视觉上更易于接受. ✎ 关于swing: • swing是一个为java设计的GUI工具包javax.swing&#xff0c;包括了用户界面的各种组件. • swing中组件可以分为两大类&…

基于FPGA的OMEGA东京奥运会计时器

截至2019年共举办了31届奥运会&#xff0c;其中27届的计时设备都由欧米茄&#xff08;OMEGA&#xff0c;Ω&#xff09;提供&#xff0c;今年的东京奥运会将会是第28届。 瑞士计时公司&#xff08;Swiss Timing&#xff09;基于火星Mars ZX2核心板打造了为奥运会等大型体育赛事…

AWVS+子域名平台联合自动化渗透测试工具(非常详细)零基础入门到精通,收藏这一篇就够了

项目地址 https://github.com/Minority2310/awvs-subdomain_platformawvs-subdomain_platform&#xff1a;AWVS子域名平台联合自动化渗透测试 如有侵权&#xff0c;请联系删除 为了帮助大家更好的学习网络安全&#xff0c;我给大家准备了一份网络安全入门/进阶学习资料&#…

PLC程序远程上下载

在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;扮演着至关重要的角色。然而&#xff0c;传统的PLC程序上传与下载方式往往受限于物理距离和现场环境&#xff0c;给工程师们带来了诸多不便。如今&#xff0c;随着远程技术的不断发展&#xff0c;PLC程…

Stable Diffusion XL优化终极指南

如何在自己的显卡上获得SDXL的最佳质量和性能&#xff0c;以及如何选择适当的优化方法和工具&#xff0c;这一让GenAI用户倍感困惑的问题&#xff0c;业内一直没有一份清晰而详尽的评测报告可供参考。直到全栈开发者Flix San出手。 在本文中&#xff0c;Flix介绍了相关SDXL优化…

好用且免费的无需搭梯子的长文本场景对话大模型

这款ai工具最近爆火&#xff0c;Kimi支持200万字无损上下文&#xff0c;在长上下文窗口技术上再次取得突破&#xff0c;引燃人工智能领域新一轮投资热情。我也是支持国货&#xff0c;抱着试一试的心态使用&#xff0c;确实不错&#xff0c; China&#x1f402;&#x1f37a;

【Java开发指南 | 第十三篇】Java条件语句

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 if 语句if...else 语句if...else if...else 语句嵌套的 if…else 语句switch 语句 Java 中的条件语句用于根据条件来执行不同的代码块。条件语句允许程序根据表达式的结果选择性地执行代码。 条件语句分为if 语…

[Win11·Copilot] Win11 系统更新重启后任务栏 Copilot 图标突然消失 | 解决方案

文章目录 前言Copilot介绍产生异常的原因解决方案总结 前言 在 Windows 11 的最新系统更新之后&#xff0c;一些用户报告了任务栏中 Copilot 图标消失的问题。这篇技术博文将为您提供详细的解决方案&#xff0c;帮助您恢复 Copilot 图标&#xff0c;并确保您能够继续享受 Copi…

3D模型查看器开发实战【WebGL】

本文介绍如何从头开发一个包含3D 模型查看器的页面 - 尽管它非常简单&#xff0c;但你将学习的步骤也应该有助于构建其他类型的 Web 应用程序。 在自己的网站或博客里展示3D模型更简单的方式是使用NSDT 3DConvert提供的在线服务&#xff0c;无需任何开发工作&#xff0c;5分钟…

【小技巧】机器学习中可视化高维向量的两种方法PCA和t-SNE,以及其原理介绍和代码示例(附代码)

使用情景&#xff1a;比如说现在我有一批numpy的多维向量&#xff0c;比如说都是256维度的&#xff0c;X.shape(n, 256), 已知它们都是经过训练能够在256dim的超球面上实现分类或聚类的&#xff0c;现在我想把它们可视化出来看看各个簇在超球面上的分布是怎样的&#xff1f; 1…

陈胜许诺‘苟富贵,勿相忘’的那些工友们,后来都怎么样了?

记得初三语文上册的课文中&#xff0c;有一篇叫《陈涉世家》文章&#xff0c;节选自《史记》&#xff0c;讲述的是秦末农民起义军领袖陈胜吴广的故事。其中陈胜有三句话让人记忆犹新&#xff0c;其中有两句是他在地主家当农民工时&#xff0c;和一起做事的工友说的。第一句话就…

Vue项目实现懒加载——自用笔记

熟悉指令语法&#xff1a; <template><HomePanel title"人气推荐" sub-title"人气爆款 不容错过"><ul class"goods-list"><li v-for"item in hotList" :key"item.id"><RouterLink to"/&qu…

免费学习简单实操,轻松拿下微软生成式AI认证

在这个AI风暴席卷全球的时代&#xff0c;我们都处在一个充满机遇和挑战的交叉点上。无论你是正在寻找新的职业道路&#xff0c;还是希望在现有的职业生涯中取得突破&#xff0c;掌握AI技能都将成为你开启新篇章的关键。 为了帮助更多的人在这个AI时代中实现跨越&#xff0c;微…

网工内推 | 14薪!安全服务工程师,上市公司,CISP认证优先

01 远江盛邦 招聘岗位&#xff1a;安全服务工程师 职责描述&#xff1a; 1、负责对客户网络、系统进行渗透测试&#xff0c;漏洞验证、安全评估和安全加固&#xff1b; 2、负责对监督单位的系统安全问题进行监督&#xff0c;并督察改进&#xff1b; 3、对监管单位的安全告警、…

力扣136. 只出现一次的数字

Problem: 136. 只出现一次的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 由于题目要求使用线性时间复杂度和常量级的空间复杂度&#xff0c;再加上找重复元素这个特性&#xff0c;我们可以想到使用位运算来求解&#xff1a; 1.任何数与其本身异或得0&#xff0c;任何…

HackMyVM-BaseME

目录 信息收集 arp nmap WEB web信息收集 gobuster hydra 目录检索 ssh 提权 get user sudo base64提权 get root 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168…

go语言context

context在服务端编程基本都贯穿所有&#xff0c; Context 是请求的上下文信息。对于RPC Server来说&#xff0c;一般每接收一个新的请求&#xff0c;会产生一个新的Context&#xff0c;在进行内部的函数调用的时候&#xff0c;通过传递Context&#xff0c;可以让不同的函数、协…

python二级题目-仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留 3 位。

x(((3**4)5*(6**7))/8)**0.5 .format 用法一&#xff1a; print({}.format(1)) 1 print(这个是format的用法{}。。。.format(3)) 这个是format的用法3 ’大括号1:{},大括号2:{},大括号3:{}‘.format(3,4,5) print(’大括号1:{},大括号2:{},大括号3:{}‘.form…