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

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

目录

一、动态规划解题模版

  1. 状态表示:我们一般创建一个一维数组dp,把dp表填满,其中的某一个值就是结果。而状态表示就是指这个dp表中元素的含义;
    1.1. 来源:题目要求,经验+题目要求 ,分析问题的过程中的重复子问题
  2. 状态转移方程:dp[ i ] = ?
  3. 初始化:保证根据状态转移方程填表时不越界
  4. 填表顺序:为了填写当前状态的时候,所需要的状态已经计算过了
  5. 返回值:题目要求 + 状态表示

二、第N个泰波那契数

题目链接:第N个泰波那契数
题目描述:

  • 第四个数是钱三个数的和,第一二三个数定下位0 1 1,返回第n个数


题目解析:

解题思路:

  1. 状态表示:dp[ i ] 表示的 i 个泰波那锲数
  2. 状态转移方程:dp[ i ] = dp[ i - 1] + dp[ i - 2] + dp[ i - 3]
  3. 初始化:dp[ 0 ] = 0, dp[ 1 ]= 1, dp[ 2 ] = 1
  4. 填表顺序:顺序从左向右填表即可
  5. 返回值: dp[ n ]

解题代码:

//时间复杂度:O(N)//空间复杂度:O(N)classSolution{publicinttribonacci(int n){if(n <3)return n ==0?0:1;//创建dp表int[] dp =newint[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];}}

空间优化:只创建长度为三的数组即可:

//时间复杂度:O(N)//空间复杂度:O(1)classSolution{publicinttribonacci(int n){if(n <3)return n ==0?0:1;//创建dp表int[] dp =newint[]{0,1,1};//填表for(int i =3; i <= n; i++){int tmp = dp[0]; dp[0]= dp[1]; dp[1]= dp[2]; dp[2]= tmp + dp[0]+ dp[1];}//返回值return dp[2];}}

三、⾯试题 08.01. 三步问题

题目链接:⾯试题 08.01. 三步问题](https://leetcode.cn/problems/three-steps-problem-lcci/description/)

题目描述:

题目解析:

  • 每一次上楼梯有三个选择: 1 2 3 ,返回走 到第n阶梯 步有多少种走法

解题思路:

  1. 状态表示:dp[ i ] 表示第 i 阶的上楼方式种类数
  2. 状态转移方程:dp[ i ] = dp[ i - 1] + dp[ i - 2] + dp[ i - 3]
  3. 初始化:dp[ 0 ] = 1, dp[ 1 ]= 1, dp[ 2 ] = 2 (小孩有3种走法,那么小孩的上一个台阶的可能就是 i-1, i-2, i-3 )
  4. 填表顺序:顺序从左向右填表即可
  5. 返回值: dp[ n ]

解题代码:

//时间复杂度:O(N)//空间复杂度:O(N)classSolution{publicintwaysToStep(int n){if(n <3)return n;//建立dp表int[] dp =newint[n+1];//初始化 dp[0]= dp[1]=1; dp[2]=2;//填表for(int i =3; i <= n; i++){ dp[i]=((dp[i-1]+ dp[i-2])%1000000007+ dp[i-3])%1000000007;}//返回值return dp[n];}}

四、746. 使⽤最⼩花费爬楼梯(easy)

题目链接:746. 使⽤最⼩花费爬楼梯(easy)

题目描述:

题目解析:

  • 给我们一个cost数组,表示走出这一个台阶需要的花费,
  • 可以选择第一步从cost[ 0 ] 还是 cost [ 1 ]开始。
  • 让我们返回到达楼顶的最小总花费。

解题思路:

  1. 状态表示:dp[ i ] 表示走到第 i 阶的最小花费
  2. 状态转移方程:dp[ i ] = dp[i-1]+cost[i-1] 和 dp[i-2]+cost[i-2] 的较小值
  3. 初始化:表的长度要比cost大1,表示楼顶
  4. 填表顺序:顺序从左向右填表即可
  5. 返回值: dp[ n ]
    解题代码:
//时间复杂度:O(N)//空间复杂度:O(N)classSolution{publicintminCostClimbingStairs(int[] cost){int n = cost.length;if(n ==2)returnMath.min(cost[0],cost[1]);//状态转移表int[] dp =newint[n+1];//状态转移方程for(int i =2; i <= n; i++){ dp[i]=Math.min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);}return dp[n];}}

五、91.解码⽅法

题目链接:91.解码⽅法

题目描述:

题目解析:

  • 给我们一个编码规则,数字1 - 26 对应表示字母A - Z
  • 给我们一个纯数字的字符串,让我们将字符串进行拆分,拆分后的字符串,对应的所有子串都可以对应表示成字母
  • 求可以拆分的种数

解题思路:

  1. 状态表示:dp[ i ] 表示字符串中 0 到 i 字符的合法拆分结果
  2. 状态转移方程:
    2.1. i 位置上字符为 1 到 9 的字符 单独解码成功 dp[ i ] += dp[ i - 1]
    2.2. i 与 i-1位置上的字符组合是 10 到 26 的合法编码 dp[ i ] += dp[ i-2 ]
  3. 初始化:
    3.1. dp[ 0 ] :第一个字符不为0,就dp[ 0] = 1,为0就返回0
    3.2. dp[ 1 ]:该字符不为0,dp[ 1 ] += dp[ 0 ],与第0个字符组成合法编码10 - 26 ,dp[ 1 ] += 1;

填表顺序:从左到右
返回值:dp[ n-1 ]

解题代码:

classSolution{publicintnumDecodings(String s){//前导0if(s.charAt(0)=='0')return0;int n = s.length();char[] ch = s.toCharArray();//只有一个字符if(n ==1)return1;int[] dp =newint[n];//初始化 dp[0]=1;//初始化第二个元素if(ch[1]!='0'&& ch[0]!='0') dp[1]+=1;int t =(ch[1]-'0')+(ch[0]-'0')*10;if(t >=10&& t <=26) dp[1]+=1;//填表for(int i =2; i < n; i++){//该字符单独组if(ch[i]!='0') dp[i]+= dp[i-1];//与前一个字符组 t =(ch[i]-'0')+(ch[i-1]-'0')*10;if(t >=10&& t <=26) dp[i]+= dp[i-2];}return dp[n-1];}}

Read more

算法兵法全略(译文)

算法兵法全略(译文)

目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇   始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧的人没办法掌控它,缺乏睿智的头脑难以洞悉其中的精妙。所以,立志钻研算法的人,一开始就得考察五件关键的事,通过仔细比对谋划,来探寻其中的门道。 第一项是 “算力”,它是算法运行的硬件基础。就好比电脑有着强大的芯片,运算速度快如迅猛的雷电,海量的数据可以毫无阻碍地流通处理,依靠这样的算力,就能应对复杂艰难的运算任务。第二点是 “逻辑”,它如同行军打仗时排布阵势的规则纪律。各个环节紧密相连、条理清晰,能保证指令有条不紊,步骤清清楚楚,只要其中一个环节出错,整个算法就没办法成功运行。“数据” 排在第三位,它就像是军队里的粮草与士兵。广泛收集来自各个地方的信息,数据充足时,算法就如同插上丰满的羽翼,能够大展身手;

By Ne0inhk
马年“码”上发力:用Manacher“马拉车”算法,拉平最长回文难题

马年“码”上发力:用Manacher“马拉车”算法,拉平最长回文难题

💗博主介绍:计算机专业的一枚大学生 来自重庆 @燃于AC之乐✌专注于C++技术栈,算法,竞赛领域,技术学习和项目实战✌ 💗根据博主的学习进度更新(可能不及时) 💗后续更新主要内容:C语言,数据结构,C++、linux(系统编程和网络编程)、MySQL、Redis、QT、Python、Git、爬虫、数据可视化、小程序、AI大模型接入,C++实战项目与学习分享。 👇🏻 精彩专栏 推荐订阅👇🏻 点击进入🌌作者专栏🌌: 算法画解 ✅ C++ ✅ 🌟算法相关题目点击即可进入实操🌟 感兴趣的可以先收藏起来,请多多支持,还有大家有相关问题都可以给我留言咨询,希望希望共同交流心得,一起进步,你我陪伴,学习路上不孤单! 文章目录 * 前言 * Manacher(马拉车)算法 * 问题: * 1.相关概念引入

By Ne0inhk
实现Python将csv数据导入到Neo4j

实现Python将csv数据导入到Neo4j

目录 一、获取数据集 1.1 获取数据集 1.2 以“记事本”方式打开文件 1.3  另存为“UTF-8”格式文件 1.4 选择“是” 二、 打开Neo4j并运行 2.1 创建新的Neo4j数据库 2.2 分别设置数据库名和密码 编辑 2.3 启动Neo4j数据库 2.4 打开Neo4j数据库  2.5 运行查看该数据库是否为空 三、打开Python创建项目  3.1 创建一个包,存项目 3.2 创建一个项目 3.3 检查自己的依赖是否完全

By Ne0inhk
【算法通关指南:算法基础篇】二分答案专题:1.木材加工 2.砍树

【算法通关指南:算法基础篇】二分答案专题:1.木材加工 2.砍树

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南 》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、二分答案 * 二、二分答案经典算题 * 2.1 木材加工 * 2.1.1题目 * 2.1.2 算法原理 * 2.1.3 代码 * 2.2 砍树 * 2.2.1 题目 * 2.2.2 算法原理 * 2.2.3 代码 * 总结与每日励志 前言 二分答案是算法竞赛与笔试中极具技巧性的高分解法,核心思路是将复杂求解转化为简洁的二分+判定,

By Ne0inhk