算法修炼-动态规划之斐波那契数列模型

2024-03-01 06:04

本文主要是介绍算法修炼-动态规划之斐波那契数列模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、动态规划的算法原理

        这是本人动态规划的第一篇文章,所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满dp表(一段数组)。首先要先确定好dp表每个位置的值所代表的含义是什么,然后通过题目条件以及经验推出状态转移方程,第三个就是初始化,确定填表顺序以及保证填表不越界,最后输出题目所需的结果,大致就是这个思路。

二、斐波那契数列模型例题分析

1137. 第 N 个泰波那契数 - 力扣(LeetCode)

本题的思路较为简单,状态转移方程已经给出,直接上代码:

class Solution {
public:int tribonacci(int n) {vector<int> v1(n+1);//初始化if(n == 1)return 1;else if(n == 2)return 1;else if(n == 0)return 0;v1[0] = 0;v1[1] = 1;v1[2] = 1;for(int i = 3; i <= n; i++){v1[i] = v1[i-1] + v1[i-2] + v1[i-3];}return v1[n];}
};

面试题 08.01. 三步问题 - 力扣(LeetCode)

解析: 

        假设小孩此时正处于某一台阶上,那他是如何到达这一台阶的呢?是不是他有可能是从该台阶的前一个台阶跳上来的,也可能是从该台阶的前两个台阶跳上来的,也可能是从该台阶的前三个台阶跳上来的,所以小孩到某一台阶就有三种可能情况,也即dp表中某个位置的值就是这个位置前三个位置的值相加,从而确定出了状态转移方程。

class Solution {
public:int waysToStep(int n) {//创建dp表vector<int> v1(n+1);if(n ==1)return 1;if(n == 2)return 2;if(n == 3)return 4;//初始化v1[1] = 1;v1[2] = 2; v1[3] = 4;for(int i = 4; i <= n; i++){//确定状态转移方程,这里需要注意,加数的和可能会越界,根据题目要求要对1000000007取模v1[i] = ((v1[i-1] + v1[i-2]) % 1000000007 + v1[i-3])%1000000007;} return v1[n];}
};

 746. 使用最小花费爬楼梯 - 力扣(LeetCode)

解析: 

        要确定每一级楼梯最低花费,通过比较前两级楼梯,确定应该加的值,从而确定状态转移方程。

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int length = cost.size();//dp表vector<int> MinCost(length);//初始化for(int i = 0; i<cost.size(); i++){MinCost[i] = cost[i];}//状态转移方程for(int i = 2; i<length; i++){if(MinCost[i-1] < MinCost[i-2]){MinCost[i] += MinCost[i-1];}else{MinCost[i] += MinCost[i-2];}}if(MinCost[cost.size() - 1] < MinCost[cost.size() - 2]){return MinCost[cost.size() - 1];}else{return MinCost[cost.size() - 2];}}
};

 91. 解码方法 - 力扣(LeetCode)

解析: 

        选定一个位置作为结尾,如果这个位置的值不为零,就看其能否与前一个位置的值组成合法编码,如果能,这个位置的值就是它的前一个位置加上它的前前一个位置的值,如果不能,这个位置的值就是它的前一个位置的值;如果这个位置的值为零,就看其能否与前一个位置的值组成合法编码,如果能,这个位置的值就是它的前前一个位置的值。

class Solution {
public:int numDecodings(string s) {int len = s.length();int arr[len];const char* str;str = s.c_str();for(int i = 0; i<len; i++){arr[i] = str[i] - 48;}//处理特殊情况if(arr[0] == 0){return 0;}else if(len == 1 && arr[0] != 0){return 1;}for(int i = 1; i<len; i++){//例:30if(arr[i] == 0 && (arr[i-1] >2)){return 0;}//例:1001else if(i+1 < len && arr[i] == 0 && arr[i+1] == 0){return 0;}}for(int i = 0; i<len; i++){cout << arr[i] << " ";}//dp表vector<int> vect(len+1);//初始化vect[0] = 1;vect[1] = 1;//状态转移方程for(int i = 2; i < vect.size(); i++){if(arr[i-1] != 0){if(arr[i-2] != 0 && ((arr[i-1] + arr[i-2]*10) <= 26)){vect[i] = vect[i-1] + vect[i-2];}else{vect[i] = vect[i-1];}}else{vect[i] = vect[i-2];}}return vect[len];}
};

这篇关于算法修炼-动态规划之斐波那契数列模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761430

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.