[Algorithm][递归][斐波那契数列模型][第N个泰波那契数][三步问题][使用最小花费爬楼][解码方法]详细讲解

本文主要是介绍[Algorithm][递归][斐波那契数列模型][第N个泰波那契数][三步问题][使用最小花费爬楼][解码方法]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.第 N 个泰波那契数
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.三步问题
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.使用最小花费爬楼梯
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 4.解码方法
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.第 N 个泰波那契数

1.题目链接

  • 第 N 个泰波那契数

2.算法原理详解

  • 题目解析
    请添加图片描述

  • 思路

    • 确定状态表示 -> dp[i]的含义
      • i个泰波那契数的值
    • 推导状态转移方程
      • dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
    • 初始化
      • dp[0] = 0, dp[1] = 1, dp[2] = 1
    • 确定填表顺序:从左向右
    • 确定返回值:dp[n]
  • 空间优化:滚动数组
    请添加图片描述


3.代码实现

// v1.0 动态规划
int tribonacci(int n) 
{// 边界情况处理if(n == 0 || n == 1) return n;vector<int> dp(n + 1, 0);dp[1] = dp[2] = 1;for(int i = 3; i <= n; i++){dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];}return dp[n];
}
-------------------------------------------------------------------
// v2.0 动态规划 + 滚动数组空间优化
int tribonacci(int n) 
{// 边界情况处理if(n == 0 || n == 1) return n;int a = 0, b = 1, c = 1, ret = 1;for(int i = 3; i <= n; i++){ret = a + b + c;a = b, b = c, c = ret; // 滚动数组}return ret;
}

2.三步问题

1.题目链接

  • 三步问题

2.算法原理详解

  • 题目解析
    请添加图片描述

  • 思路

    • 确定状态表示 -> dp[i]的含义
      • 到达i位置时,一共有多少种方法
    • 推导状态转移方程
      • dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
    • 初始化
      • dp[1] = 1, dp[2] = 2, dp[3] = 4
    • 确定填表顺序:从左向右
    • 确定返回值:dp[n]

3.代码实现

int waysToStep(int n) 
{// 边界情况处理if(n == 1 || n == 2) return n;if(n == 3) return 4;const int MOD = 1e9 + 7;vector<int> dp(n + 1, 0);dp[1] = 1, dp[2] = 2, dp[3] = 4;for(int i = 4; i <= n; i++){dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;}return dp[n];
} 

3.使用最小花费爬楼梯

1.题目链接

  • 使用最小花费爬楼梯

2.算法原理详解

  • 本题给出两种思路,本质相同,只是思考的方向不同
  • 思路一
    • 确定状态表示 -> dp[i]的含义
      • i位置为结尾
      • 到达i位置时,最小花费
    • 推导状态转移方程
      • dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
    • 初始化
      • dp[0] = dp[1] = 0
    • 确定填表顺序:从左向右
    • 确定返回值:dp[n]
  • 思路二
    • 确定状态表示 -> dp[i]的含义
      • i位置为起点
      • i位置出发,到达楼顶,此时的最小花费
    • 推导状态转移方程
      • dp[i] = cost[i] + min(dp[i + 1], dp[i + 2])
    • 初始化
      • dp[n - 1] = cost[n - 1], dp[n - 2] = cost[n - 2]
    • 确定填表顺序:从右向左
    • 确定返回值:min(dp[0], dp[1])

3.代码实现

// v1.0 以i位置为结尾
int minCostClimbingStairs(vector<int>& cost) 
{int n = cost.size();vector<int> dp(n + 1);for(int i = 2; i <= n; i++){dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[n];
}
----------------------------------------------------------------------------
// v2.0 以i位置为起点
int minCostClimbingStairs(vector<int>& cost) 
{int n = cost.size();vector<int> dp(n);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]);
}

4.解码方法

1.题目链接

  • 解码方法

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置为结尾时,解码方法的总数
    • 推导状态转移方程

      • 如果条件都成立dp[i] = dp[i - 1] + dp[i - 2]
        请添加图片描述
    • 初始化

      • dp[0]:只解码一个字符
        • 1 <-- 1<=a<=9
        • 0 <-- 0
      • dp[1]:只解码两个字符
        • 0 <-- 解码不出来
        • 1 <-- 两个解码出一个
        • 2 <-- 两个解码出一个 + 一个解码出一个
    • 确定填表顺序:从左向右

    • 确定返回值:dp[n - 1]

  • 优化边界及初始化dp表多开一个"虚拟结点"
    • 相当于把原来dp[1]放到了后面填表的逻辑当中了,不用进行繁琐的初始化了
    • 注意事项
      • 虚拟节点里面的值,要保证后面填表时是正确的
      • 下标的映射关系
    • 怎样处理?
      • 此时dp[1]的初始化相当于原来的dp[0]的初始化,不用做特殊处理
      • dp[0] = 1做特殊处理
        • 因为此时的dp[2]在统一的逻辑里面,会去看dp[0]dp[1]的值
          • 如果条件都成立dp[2] = dp[0] + dp[1]
        • 此时如果dp[0] == 0,相当于dp[2]前面少了一种可能
          请添加图片描述

3.代码实现

// v1.0
int numDecodings(string s) 
{int n = s.size();vector<int> dp(n, 0);dp[0] = s[0] != '0';// 处理边界情况if(s.size() == 1) return dp[0];// 一个位置解码出来一个if(s[0] != '0' && s[1] != '0'){dp[1]++;}// 两个位置解码出来一个int tmp = (s[0] - '0') * 10 + s[1] - '0';if(tmp >= 10 && tmp <= 26){dp[1]++;}// Dynamic Planfor(int i = 2; i < n; i++){// 一个位置解码出来一个if(s[i] != '0'){dp[i] += dp[i - 1];}// 两个位置解码出来一个int tmp = (s[i - 1] - '0') * 10 + s[i] - '0';if(tmp >= 10 && tmp <= 26){dp[i] += dp[i - 2];}}return dp[n - 1];
}
----------------------------------------------------------------------
// v2.0 优化
int numDecodings(string s) 
{int n = s.size();vector<int> dp(n + 1, 0);dp[0] = 1;dp[1] = s[0] != '0';// Dynamic Planfor(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];
}

这篇关于[Algorithm][递归][斐波那契数列模型][第N个泰波那契数][三步问题][使用最小花费爬楼][解码方法]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实