动态规划——斐波那契数列模型问题

文章目录

    • 1137. 第 N 个泰波那契数
      • 算法原理
      • 代码实现
    • 面试题 08.01. 三步问题
      • 算法原理
      • 代码实现
    • 746. 使用最小花费爬楼梯
      • 算法原理
      • 代码实现
    • 91. 解码方法
      • 算法原理
      • 代码实现

1137. 第 N 个泰波那契数

题目链接:1137. 第 N 个泰波那契数

算法原理

  • 状态表示:
    根据题目要求可得出

  • 状态转移方程:
    也是根据题目得出dp[i]依赖前三个状态dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

  • 初始化:
    保证填表不越界,根据题目可以得出

    dp[0] = 0;
    dp[1] = dp[2] = 1;
    
  • 填表顺序:
    根据前面的状态,计算当前状态
    从左向右

  • 返回值:dp[i]

代码实现

class Solution {
public:
    int tribonacci(int n)
    {
        if(n == 0)  return 0;
        if(n == 1 || n == 2)    return 1;
        //dp表
        vector<int> dp(n+1);
        //初始化
        dp[0] = 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];
    }
};

这里可以用空间优化,求当前状态的时候,只依赖前面3个状态。

滚动数组

class Solution {
public:
    int tribonacci(int n)
    {
        if(n == 0)  return 0;
        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;
    }
};

面试题 08.01. 三步问题

题目链接:面试题 08.01. 三步问题

image-20250205195909588

  • 到1号位置:1种方法(起始位置上2个台阶)

  • 到2号位置:

    起始位置直接上2阶

    1号位置上1阶(经过1号一种方法)
    1+1 = 2种方法

  • 到3号位置
    从起始位置上3阶
    1号位置上2阶(经过1号一种方法)
    2号位置上1阶(经过2号两种方法)

    1 + 1 + 2 = 4种方法

  • 到4号位置
    从1号位置上3阶(经过1号一种方法)
    从2号位置上2阶(经过2号两种方法)
    从3号位置上1阶(经过3号4种方法)
    1 + 2 + 4 = 7种方法

之后就是同理…

算法原理

  • 状态表示:
    到达i号台阶一共有多少种方法

  • 状态转移方程:
    以i位置最近的一步(三种,因为可以跨1、2、3阶)
    dp[i] = dp[i-3] + dp[i-2] + dp[i-1]

  • 初始化:
    一个状态依赖前3个状态,刚刚上面推出了

    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 4;
    
  • 填表顺序:
    从左往右

  • 返回值:dp[i]

代码实现

class Solution {
public:
    int waysToStep(int n)
    {
        if(n == 1)  return 1;
        if(n == 2)  return 2;
        if(n == 3)  return 4;
        vector<int> dp(n + 1);
        int MOD = 1e9 + 7;
        //初始化
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        //到达i台阶有多少种方法
        for(int i = 4; i <= n; i++)
        {
            //上台阶3种, 选取最近一步划分
            //i-1 i-2 i-3
            dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3]) % MOD;
        }
        return dp[n];

    }
};

746. 使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯

题目有一个要注意的,到达楼梯顶,并不是数组末尾元素,而是在末尾元素的下一个位置

算法原理

  • 状态表示:

    以xx位置为结尾,xxx(题目要求)

    这里的xxx就是到达i位置的最小花费

  • 状态转移方程:
    以i位置最近的一步(两种,因为可以跨1、2阶)

    image-20250205202304141
    dp[i] = min(dp[i-2]+cost[i-2], dp[i-1] + cost[i-1])

  • 初始化(保证填表不越界):

    dp[0] = dp[1] = 0;
    dp[2] = 2;
    dp[3] = 4;
    
  • 填表顺序:
    从左往右

  • 返回值:dp[i]

代码实现

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];
    }
};

91. 解码方法

题目链接:91. 解码方法

算法原理

  • 状态表示:
    以某个位置为结尾,xxx
    dp[i]表示以i位置为结尾,解码方法的总数
  • 状态转移方程:
    根据最近一步,划分问题
    image-20250205205453621
  • 初始化:
    一个状态依赖前2个状态
    image-20250205205617609
  • 填表顺序:
    从左往右
  • 返回值:dp[i-1]

代码实现

class Solution {
public:
    int numDecodings(string s)
    {
        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 cmb = (s[0]-'0')*10 + (s[1]-'0');
        if(cmb >= 10 && cmb <= 26)
        {
            dp[1] += 1;
        }

        for(int i = 2; i < n; i++)
        {
            if(s[i] != '0')
            {
                dp[i] += dp[i-1];
            }

            cmb = (s[i-1]-'0')*10 + (s[i]-'0');
            if(cmb >= 10 && cmb <= 26)
            {
                dp[i] += dp[i-2];
            }
        }
        return dp[n-1];
    }
};

代码优化:

为什么虚拟节点可以填1? 因为在原始的0和1位置拼接起来,要是能解码成功,说明找到了一种解码方式,是要加上dp[0]的值,如果dp[0]为0的话,就相当于忽略掉了。

image-20250205211156316

class Solution {
public:
    int numDecodings(string s)
    {
        int n = s.size();
        vector<int> dp(n+1);   
        
        dp[0] = 1;
        dp[1] = s[0] != '0';
        for(int i = 2; i <= n; i++)
        {
            if(s[i-1] != '0')
            {
                dp[i] += dp[i-1];
            }

            int cmb = (s[i-2]-'0')*10 + (s[i-1]-'0');
            if(cmb >= 10 && cmb <= 26)
            {
                dp[i] += dp[i-2];
            }
        }
        return dp[n];
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备&#xff0c;其运行状态直接关系到生产安全与经济效益。据统计&#xff0c;涡轮故障导致的非计划停机可造成每小时数十万元的经济损失&#xff0c;且突发故障可能引发严重安全事故。传统人…

java程序员面试自身优缺点,详细说明

程序员面试大厂经常被问到的Java异常机制问题,你搞懂了吗运行时异常:运行时异常是可能被程序员避免的异常。与检查性相反,运行时异常可以在编译时被忽略。错误(ERROR):错误不是异常,而是脱离程序员控制的问题。错误通常在代码中容易被忽略。例如:当栈溢出时,一个错误就发生了,它…

大话特征工程:3.特征扩展

公元 2147 年&#xff0c;人类文明站在科技的巅峰&#xff0c;所有决策、发展甚至感知都被“全维计算网络”所掌控。这套系统以高维空间中的数据为基础&#xff0c;试图预测并塑造未来。然而&#xff0c;这场辉煌的技术革命却在悄无声息之间酿成了人类最大的危机——维数灾难。…

CSV数据分析智能工具(基于OpenAI API和streamlit)

utils.py&#xff1a; from langchain_openai import ChatOpenAI from langchain_experimental.agents.agent_toolkits import create_csv_agent import jsonPROMPT_TEMPLATE """你是一位数据分析助手&#xff0c;你的回应内容取决于用户的请求内容。1. 对于文…

2025.2.5

Web [SWPUCTF 2021 新生赛]ez_unserialize: 这个题先了解一下反序列化&#xff1a;反序列化是序列化的逆过程。序列化是将对象或数据结构转换为可以存储或传输的格式&#xff08;如JSON、XML或二进制格式&#xff09;的过程。反序列化则是将这个格式的数据转换回原始的对象或…

新版AndroidStudio 修改 jdk版本

一、问题 之前&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后&#xff0c;比如我升级到了Android Stu…

Web3技术详解

Web3技术代表着互联网技术的最新进展&#xff0c;它致力于打造一个去中心化的互联网生态系统。以下是对Web3技术的详细解析&#xff1a; 一、Web3技术的核心概念 Web3是第三代互联网技术的代名词&#xff0c;代表着去中心化、区块链驱动和用户自有控制的理念。在Web3的世界中…

景联文科技:专业数据采集标注公司 ,助力企业提升算法精度!

随着人工智能技术加速落地&#xff0c;高质量数据已成为驱动AI模型训练与优化的核心资源。据统计&#xff0c;全球AI数据服务市场规模预计2025年突破200亿美元&#xff0c;其中智能家居、智慧交通、医疗健康等数据需求占比超60%。作为国内领先的AI数据服务商&#xff0c;景联文…

3.【BUUCTF】XSS-Lab1

进入题目页面如下 好好好&#xff0c;提示点击图片&#xff0c;点进去页面如下&#xff0c;且url中有传参&#xff0c;有注入点 发现题目给出了源码 查看得到本题的源码 分析一下代码 <!DOCTYPE html><!--STATUS OK--> <!-- 声明文档类型为 HTML5&#xff0c;告…

进程、线程、内存和IO模型的概念详解

进程、线程、内存和IO模型的概念详解 1 进程与线程1.1 进程1.1.1 进程分类1.1.2 进程的状态和转换1.1.3 僵尸进程和孤儿进程的区别1.1.4 进程之间的通信1.1.5 用户态和内核态1.1.6 用户空间和内核空间 1.2 线程1.2.1 线程的状态和转换1.2.2 进程与线程的区别 1.3 多进程和多线程…

浅谈密码相关原理及代码实现

本代码仅供学习、研究、教育或合法用途。开发者明确声明其无意将该代码用于任何违法、犯罪或违反道德规范的行为。任何个人或组织在使用本代码时&#xff0c;需自行确保其行为符合所在国家或地区的法律法规。 开发者对任何因直接或间接使用该代码而导致的法律责任、经济损失或…

Swagger相关内容整合

mvc:pathmatch:matching-strategy: ant_path_matcher 一、引入相关依赖 <!-- 图像化依赖 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version> </de…

【数据结构】循环链表

循环链表 单链表局限性单向循环链表判断链表是否有环思路code 找到链表入口思路代码结构与逻辑 code 单链表局限性 单链表作为一种基本的数据结构&#xff0c;虽然在很多场景下都非常有用&#xff0c;但它也存在一些局限性&#xff1a; 单向访问&#xff1a;由于每个节点仅包含…

简易C语言矩阵运算库

参考网址&#xff1a; 异想家纯C语言矩阵运算库 - Sandeepin - 博客园 这次比opencv快⑥倍&#xff01;&#xff01;&#xff01; 参考上述网址&#xff0c;整理了一下代码&#xff1a; //main.c#include <stdio.h> #include <stdlib.h> #include <string.h…

微服务知识——微服务架构的演进过程

文章目录 初始架构&#xff1a;单机架构第一次演进&#xff1a;Tomcat与数据库分开部署第二次演进&#xff1a;引入本地缓存和分布式缓存第三次演进&#xff1a;引入反向代理实现负载均衡第四次演进&#xff1a;数据库读写分离第五次演进&#xff1a;数据库按业务分库第六次演进…

Hackmyvm crack

简介 难度&#xff1a;简单 靶机地址&#xff1a; 环境 kali&#xff1a;192.168.194.9 靶机&#xff1a;192.168.194.23 扫描 nmap全端口扫描查看tcp服务 三个端口服务21的ftp服务、4200的shellinabox服务&#xff0c;是一个web界面的shell连接工具&#xff0c;12359的一…

P2036 [COCI 2008/2009 #2] PERKET(dfs)

#include<bits/stdc.h> using namespace std;int n; int a[15],b[15]; int ansINT_MAX; // 初始化最小差值为一个很大的数&#xff0c;保证能找到最小值void dfs(int i,int s,int k){if(in){ // 当遍历完所有元素时if(s1&&k0) return;int difabs(s-k);ans mi…

逻辑回归:Sigmoid函数在分类问题中的应用

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 什么是Sigmoid函数&#xff1f; Sigmoid函数&#xff08;Logistic函数&#xff09;是机器学习中最经典的激活函数之一&#xff0c;是一个在生物学中常见的S型函数&#xff0c;也称为S型生长曲线。…

【OpenCV实战】基于 OpenCV 的多尺度与模板匹配目标跟踪设计与实现

文章目录 基于 OpenCV 的模板匹配目标跟踪设计与实现1. 摘要2. 系统概述3. 系统原理3.1 模板匹配的基本原理3.2 多尺度匹配 4. 逻辑流程4.1 系统初始化4.2 主循环4.3 逻辑流程图 5. 关键代码解析5.1 鼠标回调函数5.2 多尺度模板匹配 6. 系统优势与不足6.1 优势6.2 不足 7. 总结…

【系统架构设计师】操作系统 ② ( 存储管理 | 页式存储 | 逻辑地址 与 物理地址 | 页表结构 | 物理内存淘汰机制 )

文章目录 一、页式存储1、CPU 调用数据2、内存存储数据弊端3、分页存储4、逻辑地址 和 物理地址 的结构5、逻辑地址 和 物理地址 的结构 示例6、页式存储 优缺点 二、逻辑地址 与 物理地址1、逻辑地址2、物理地址3、逻辑地址 与 物理地址 区别4、逻辑地址 与 物理地址 的转换 三…