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

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

一、动态规划的算法原理

       这是本人动态规划的第一篇文章,所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满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++)
        {
            //例:30
            if(arr[i] == 0 && (arr[i-1] >2))
            {
                return 0;
            }
            //例:1001
            else 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];
    }
};
相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
24 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
7天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
39 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
11天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
28 2
|
1月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
67 2
动态规划算法学习三:0-1背包问题
|
18天前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
19天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
23天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
67 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 数据采集 算法
如何在一夜之间成为模型微调大师?——从零开始的深度学习修炼之旅,让你的算法功力飙升!
【10月更文挑战第5天】在机器学习领域,预训练模型具有强大的泛化能力,但直接使用可能效果不佳,尤其在特定任务上。此时,模型微调显得尤为重要。本文通过图像分类任务,详细介绍如何利用PyTorch对ResNet-50模型进行微调,包括环境搭建、数据预处理、模型加载与训练等步骤,并提供完整Python代码。通过调整超参数和采用早停策略等技巧,可进一步优化模型性能。适合初学者快速上手模型微调。
92 8
|
1月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
26 4
|
1月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
65 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)