【动态规划】斐波那契数列模型

简介: 【动态规划】斐波那契数列模型

动态规划(斐波那契数列模型)

1. 第 N 个泰波那契数

题目链接

  1. 状态表示
    dp[i]所表示的含义,那么这个状态表示怎么来的那?

题目要求、经验根据题目要求、分析问题的过程中发现重复子问题

  1. 状态转移方程
  2. dp[i]等于什么。根据这题的题目我们发现
    d[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
  3. 初始化
    保证填表的时候不越界
  4. 填表顺序
    为了填写当前的状态,所需的状态已经完成了
  5. 返回值
    这个题目的返回值当然就是dp[n]
  6. AC代码:
class Solution 
{
public:
    int tribonacci(int n) 
    {
        if (n == 0 || n == 1) return n;
        vector<int> dp(n + 1);
        dp[0] = 0, dp[1] = 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];
    }
};

优化之后:

AC代码:

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

2. 三步问题

题目链接

  1. 状态表示
    dp[i]表示:到达i位置时,一共有多少中走法
  2. 状态转移方程
  3. 初始化
  4. 填表
  5. 返回值

AC代码:

class Solution
{
    const int mod = 1e9 + 7;
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);
        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. 状态表示
    dp[i]表示到达i位置的最小花费
  2. 状态转移方程

  1. 初始化
  2. 填表顺序
  3. 返回值

AC代码:

class Solution 
{
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int len = cost.size();
        vector<int> dp(len + 1);
        for (int i = 2; i <= len; i++)
        {
            dp[i] = min((dp[i - 1] + cost[i - 1]), (dp[i - 2] + cost[i - 2]));
        }
        return dp[len];
    }
};

解法二

  1. 状态表示
    dp[i]从i位置出发,到达楼顶所需的最小花费
  2. 状态转移方程

  3. 初始化
    dp[n - 1] = cost[n - 1], dp[n - 2] = cont[n - 2]
  4. 填表
    从左往右
  1. 返回值
    min(dp[0], dp[1])

AC代码:

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] = min((dp[i + 1] + cost[i]), (dp[i + 2] + cost[i]));
        }
        return min(dp[0], dp[1]);
    }
};

4. 解码方法

题目链接

  1. 状态表示
    以i位置为结尾,有多少种解码方法
  2. 状态转移方程

  3. 初始化
    dp[0] = 1 或者0
    dp[1]也有三种情况 0 、1 、2
  1. 填表
  2. 返回值

AC代码:

class Solution 
{
public:
    int numDecodings(string s) 
    {
        int n = s.size();
        vector<int> dp(n + 1);
        if (s[0] == '0') dp[0] = 0;
        else dp[0] = 1;
        if (n == 1) return dp[0];
        if (s[1] >= '1' && s[1] <= '9') dp[1] += dp[0];
        int t = (s[0] - '0') * 10 + s[1] - '0';
        if (t >= 10 && t <= 26) dp[1] += 1;
        for (int i = 2; i < n; i++)
        {
            if (s[i] >= '1' && s[i] <= '9') dp[i] += dp[i - 1];
            int t = (s[i - 1] - '0') * 10 + s[i] - '0';
            if (t >= 10 && t <= 26) dp[i] += dp[i - 2];
        }
        return dp[n - 1];
    }
};

还可以使用辅助节点的方式来处理这个题目的边界问题:

需要注意的是:

  1. 辅助节点里面的值要保证后续填表是正确的
  2. 下标的映射关系
相关文章
|
运维 资源调度 Kubernetes
阿里巴巴超大规模Kubernetes基础设施运维体系揭秘
在过去近三年时间,Kubernetes架构在阿里巴巴集团经历了飞速发展:既支持了集团统一调度超大规模场景,又支持了大批云上云产品用户,还在支持OXS区容器化。经过这些年的发展,我们也逐渐锤炼出了K8S Serverless全托管稳定性运维体系。这些运维和稳定性能力不是K8S原生就具备的,而是在大量实践和失败过程中的沉淀出来的系统稳定性加固能力。
阿里巴巴超大规模Kubernetes基础设施运维体系揭秘
|
11月前
|
数据处理 索引 Python
用Python实现数据录入、追加、数据校验并生成表格
本示例展示了如何使用Python和Pandas库实现学生期末考试成绩的数据录入、追加和校验,并生成Excel表格。首先通过`pip install pandas openpyxl`安装所需库,然后定义列名、检查并读取现有数据、用户输入数据、数据校验及保存至Excel文件。程序支持成绩范围验证,确保数据准确性。
462 14
|
安全 数据库 开发者
告别Navicat:彻底卸载指南及注意事项
【10月更文挑战第12天】 Navicat,作为一款广受数据库管理员和开发者喜爱的数据库管理工具,以其强大的功能和用户友好的界面著称。然而,有时出于各种原因,如软件升级、更换工具或系统维护,我们需要将其从系统中卸载。本文将提供一个详细的Navicat卸载指南,确保卸载过程既彻底又安全。
1422 6
|
敏捷开发 数据可视化 测试技术
【Docker项目实战】使用Docker部署nullboard任务管理工具
【5月更文挑战第14天】使用Docker部署nullboard任务管理工具
602 4
|
机器学习/深度学习 人工智能 自然语言处理
Transformer类架构的发展带动多模态融合
【1月更文挑战第21天】Transformer类架构的发展带动多模态融合
440 1
Transformer类架构的发展带动多模态融合
|
Dubbo Java Serverless
Serverless 应用引擎操作报错合集之Nacos中nacos启动正常,访问白页,启动日志显示正常如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
574 0
Serverless 应用引擎操作报错合集之Nacos中nacos启动正常,访问白页,启动日志显示正常如何解决
|
Java Nacos 数据库
【深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心】—— 每天一点小知识
【深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心】—— 每天一点小知识
614 0
|
C++
斐波那契数列重要恒等式的简单推导及应用(非严格证明)
斐波那契数列重要恒等式的简单推导及应用(非严格证明)
1562 0
|
小程序
如何通过二维码展示产品信息?
在草料二维码上搭建产品信息介绍系统,在二维码上展示图片、文字、音视频等宣传介绍内容,将二维码印制在产品实物或包装物料上,客户只需要用微信扫描二维码,即可随时随地查看图文并茂的介绍。
461 0