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

一、动态规划的算法原理

        这是本人动态规划的第一篇文章,所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满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++){//例:30if(arr[i] == 0 && (arr[i-1] >2)){return 0;}//例:1001else 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];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云桥通+IDC数据中心:SDWAN企业组网实现高效连接案例

一、需求和背景 云桥通曾服务的一家大型跨国企业C公司&#xff0c;C公司多个数据中心分布在全球各地。为了实现数据共享和协作&#xff0c;数据中心之间需要建立稳定高效的网络连接。然而&#xff0c;传统的MPLS专线网络存在昂贵的成本和漫长的开通周期&#xff0c;无法满足企…

接口自动化测试思路和实战 —— 编写线性测试脚本实战!

接口自动化测试框架目的 测试工程师应用自动化测试框架的目的: 增强测试脚本的可维护性、易用性(降低公司自动化培训成本&#xff0c;让公司的测试工程师都可以开展自动化测试)。 自动化测试框架根据思想理念和深度不同&#xff0c;渐进式的分为以下几种: 线性脚本框架 模块…

SpringBoot多数据源配置(MySql、Oracle)

一、依赖 <!-- dynamic-datasource 多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId></dependency><!--oracle驱动--><dependency><groupI…

初学JavaWeb开发总结

0 什么是Web开发 Web: 全球广域网&#xff0c;又称万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web开发&#xff0c;就是开发网站的&#xff0c;如&#xff1a;淘宝、京东等等。 1 网站的工作流程 流程&#xff1a; 浏览器先向前端服务器请求前端资…

了解iptables防火墙,这一篇就够了

目录 一、IPtables介绍 iptables工作原理 iptables工作流程 1. 什么是 iptables 2. 什么是表&#xff08;tables&#xff09; 3 什么是链&#xff08;chains&#xff09; 4 什么是规则&#xff08;Policy&#xff09; 三、iptables 表和链 1、四个表&#xff1a; 2、五…

JOISC2022 复制粘贴(区间DP,字符串hash)

题目描述 题面 分析 这道题考场没有任何头绪&#xff0c;赛后也是看了许多题解才明白状态设计和转移的一步步思考过程。 首先我们需要想到 无论是屏幕上的字符串&#xff0c;还是剪切板上的字符串&#xff0c;在任何时候都必须是目标串的子串。这个非常好像&#xff0c;如果不…

计算机网络原理--传输层

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 TCP/IP五层&#xff08;或四层&#xff09;模型 传输层 TCP和UDP的区别 UDP协议 校验和 如何…

黑马程序员——接口测试——day05——Request库、Cookie、Session、UnitTest框架

目录&#xff1a; Requests库 Requests库安装和简介设置http请求语法应用案例 案例1案例2案例3案例4Cookie Cookie简介CookieSession认证方式案例5-看演示&#xff0c;此代码不需实现Session Session简介Session自动管理Cookie案例6面试题Cookie和Session区别获取指定响应数据…

c#---简易程序 包括(登录+文本编译器+图片编译器+进制转换器)

目录 form1.cs namespace login_noteimage {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void label1_Click(object sender, EventArgs e){}private void login_Click(object sender, EventArgs e){String name Nametext.Text;String …

数据结构------栈(Stack)和队列(Queue)

也是好久没写博客了&#xff0c;那今天就回归一下&#xff0c;写一篇数据结构的博客吧。今天要写的是栈和队列&#xff0c;也是数据结构中比较基础的知识。那么下面开始今天要写的博客了。 目录 栈&#xff08;Stack&#xff09; 队列&#xff08;Queue&#xff09; 喜欢就点…

c++之旅——第一弹

本篇文章内容为C语言到C语言的过渡阶段第一篇&#xff0c;用来更好地过渡到c阶段&#xff0c;所以没有讲和C语言相同的知识点&#xff0c;着重于两者之间的区别之处来进行讲述c&#xff0c;创作不易&#xff0c;希望大家多多支持哦&#xff0c;如有知识性错误欢迎评论指正&…

P沟道与N沟道MOSFET的基本概念

N沟道与P沟道MOSFET基本原理与区别 学习MOSFET时的简单笔记作为个人总结&#xff0c;仅供学习参考&#xff0c;实际电路设计请直接略过&#xff01;&#xff01;&#xff01; 文章目录 N沟道与P沟道MOSFET基本原理与区别前言一、MOSFET &#xff1f;二、N沟道MOS管原理三、P沟…