动态规划:斐波那契形(初阶)

动态规划的常规解题步骤:

  • 状态表示
  • 状态转移方程
  • 初始化
  • 返回值

状态表示

我们写动态规划问题会创建一个名为dp的数组,也就是dp表。

状态表示就是dp表里面的值的含义。那么dp表是根据什么来创建的呢?

  • 1.题目要求
  • 2.经验
  • 3.分析问题的过程中,发现子问题。

状态转移方程

状态转移方程就是dp[i]等于什么,类似与数学中的方程表达式,比如dp[i]=dp[i-1]+dp[i-2]+dp[i-3];状态转移方程是动态规划的核心,也是最难点。

初始化

初始化的目的就是保证填dp表的时候不越界。

返回值

根据题目要求和状态转移方程返回符合题意的值

斐波那契型

斐波那契型就是当下的值与前一个或者前几个的值有关,所以状态转移方程经常是dp[i]=dp[i-1]+dp[i-2]+dp[i-3]等,或者是类似的变种。

例题

接下来我们以力扣的第1137题为例,来进行具体操作。

题目链接:https://leetcode.cn/problems/n-th-tribonacci-number/description/?envType=study-plan-v2&envId=dynamic-programming

代码:

java 复制代码
class Solution {
    public int tribonacci(int n) {
        //写dp表
        //初始化
        //状态表达式
        //处理边境
        //返回
        if(n==0)return 0;
        if(n==1 || n==2) return 1;
        int[] dp=new int[n+1];
        dp[0]=0;dp[1]=1;dp[2]=1;
        for(int i=3;i<n+1;i++){
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        }
        return dp[n];

    }
}

在此题中我们用dp[i]来表示第i个数的值,此为状态表示;

紧接着我们结合题意中,发现此题的状态转移方程非常简单,就是

dp[i]=dp[i-1]+dp[i-2]+dp[i-3];

由于出现了dp[i-3]所以我们需要初始化前三个数即可。

最终返回dp[n]。

拓展题

你学会了吗?接下来用以下这道题来检验一下吧:

题目链接放在这里了

https://leetcode.cn/problems/min-cost-climbing-stairs/description/?envType=study-plan-v2&envId=dynamic-programming

代码放在这里了

java 复制代码
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        if (n == 0)
            return cost[0];
        if (n == 1)
            return Math.min(cost[0], cost[1]);
        int[] dp = new int[n + 1];
        dp[0] = cost[0];
        dp[1] = cost[1];

        for (int i = 2; i < n; i++) {
            dp[i] = Math.min(dp[i - 2], dp[i - 1]) + cost[i];
        }
        return Math.min(dp[n - 2], dp[n - 1]);
    }

}
相关推荐
熬夜敲代码的猫12 分钟前
教你如何使用set和map
c++·算法
z200509308 小时前
每日简单算法题——————跟着卡尔
算法
️是789 小时前
信息奥赛一本通—编程启蒙(3395:练68.3 车牌问题)
数据结构·c++·算法
Liangwei Lin9 小时前
LeetCode 118. 杨辉三角
算法·leetcode·职场和发展
计算机安禾9 小时前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
鼠鼠我(‘-ωก̀ )好困9 小时前
leetGPU
算法
我星期八休息9 小时前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法
池塘的蜗牛10 小时前
A Low-Complexity Method for FFT-based OFDM Sensing
算法
故事和你9110 小时前
洛谷-【图论2-1】树5
开发语言·数据结构·c++·算法·动态规划·图论
咖啡里的茶i11 小时前
视觉显著目标的自适应分割与动态网格生成算法研究
人工智能·算法·目标跟踪