当前位置: 首页 > news >正文

【算法】动态规划专题一 斐波那契数列模型 1-4

文章目录

  • 1.第N个泰波那契数
    • 1.1 题目
    • 2. 代码
  • 2. 三步问题
    • 2.1 题目
    • 2.2 思路
    • 2.3 代码
  • 3.leetcode 746.使用最小花费爬楼梯
    • 3.1 题目
    • 3.2 思路
    • 3.3 代码
  • 4.leetcode 91.解码方法
    • 4.1 题目
    • 4.2 思路
    • 4.3 代码

1.第N个泰波那契数

1.1 题目

题目链接
在这里插入图片描述

2. 代码

// 代码1:时间复杂度O(N) 空间复杂度O(N)
class Solution {
public:int tribonacci(int n) {// 1. 判断边界条件if(n == 0) return 0;if(n == 1 || n == 2) return 1;// 2. 建立dp表vector<int> dp(n + 1);// 3. 初始化dp[0] = 0, dp[1] = dp[2] = 1;// 4. 填表 转移方程 dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] for(int i = 3; i <= n; i++)dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];// 5. 返回值return dp[n];  }
};
// 代码2:时间复杂度 O(N) 空间复杂度O(1)
class Solution {
public:int tribonacci(int n) {// 1. 判断边界条件if(n == 0) return 0;if(n == 1 || n == 2) return 1;// 2. 建立dp表vector<int> dp(n + 1);// 3. 初始化int a = 0, d = 0, b = 1, c = 1;// 4. 填表 转移方程 d = c + a for(int i = 3; i <= n; i++){d = c + b + a;a = b; b = c; c = d;}// 5. 返回值return d;  }
};

2. 三步问题

2.1 题目

题目
在这里插入图片描述

2.2 思路

在这里插入图片描述

2.3 代码

class Solution {
public:int waysToStep(int n) {if (n == 1 || n == 2) return n;if(n == 3) return 4;vector<int> dp(n + 1);int MOD = 1e9 + 7;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.leetcode 746.使用最小花费爬楼梯

3.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

3.2 思路

在这里插入图片描述
在这里插入图片描述

3.3 代码

// 解法1 从前向后填表
class Solution {
public: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];}
};
// 解法二 从后向前填表
class Solution {
public: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.leetcode 91.解码方法

4.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

4.2 思路

在这里插入图片描述

4.3 代码

// 代码1 未优化初始化部分
class Solution {
public:int numDecodings(string s) {// 创建dp表// 初始化// 填表// 返回值int n = s.size();vector<int> dp(n);// 处理边界情况dp[0] = s[0] != '0';if(n == 1) return dp[0];if(s[0] != '0' && s[1] != '0') dp[1] += 1;int k1 = (s[0] - '0') * 10 + s[1] - '0'; // 前两个位置合起来表示的数//if(10 <= k1 <= 26) dp[1] += 1; // 这种写法在C++中是错误的if(k1 >=10 && k1 <= 26) dp[1] += 1;for(int i = 2; i < n; i++){if(s[i] != '0') dp[i] += dp[i - 1];int k2 = (s[i - 1] - '0') * 10 + s[i] - '0'; //if(10 <= k2 <= 26) dp[i] += dp[i - 2];if(k2 >= 10 && k2 <= 26) dp[i] += dp[i - 2];}return dp[n - 1];}
};
class Solution {
public:int numDecodings(string s) {// 优化int n = s.size();vector<int> dp(n + 1);// 处理边界情况dp[0] = 1; // 保证后面的填表是正确的dp[1] = s[1 - 1] != '0';for(int i = 2; i <= n; i++){if(s[i - 1] != '0') dp[i] += dp[i - 1];int k = (s[i - 1 - 1] - '0') * 10 + s[i - 1] - '0'; if(k >= 10 && k <= 26) dp[i] += dp[i - 2];}return dp[n];}
};

相关文章:

  • SQL基础全面指南:从CRUD操作到高级特性实战
  • GC9D01 和 GC9A01两种TFT 液晶显示驱动芯片
  • IntelliJ IDEA
  • Socat 用法详解:网络安全中的瑞士军刀
  • 依赖倒置原则
  • Kotlin 基础
  • 软件性能测试报告:办公软件性能如何满足日常工作需求?
  • 文章一《人工智能学习框架入门指南》
  • Paddle Serving|部署一个自己的OCR识别服务器
  • 【算法滑动窗口】最大的连续1的个数III
  • 一种快速计算OTA PSRR的方法(Ⅱ)
  • ARM架构详解:定义、应用及特点
  • Qt结构体运算符重载指南
  • 爱胜品ICSP YPS-1133DN Plus黑白激光打印机报“自动进纸盒进纸失败”处理方法之一
  • patch命令在代码管理中的应用
  • 【论文速递】2025年09周 (Robotics/Embodied AI/LLM)
  • RAG技术完全指南(三):LlamaIndex架构解析与私有知识库搭建
  • 【五一培训】Day 2
  • 【quantity】5 derive_more库 2.0 版介绍
  • 藏文情感分析器入门学习实践
  • 张建华评《俄国和法国》|埃莲娜·唐科斯的俄法关系史研究
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 上海与世界|黄菊与上海建设中国式全球城市
  • 美国第一季度经济环比萎缩0.3%,特朗普:怪拜登,与关税无关
  • 制定出台民营经济促进法有何重大意义?全国人大常委会法工委回应
  • 昂立教育:去年减亏1.39亿元,今年以“利润持续增长”为核心目标