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

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

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

状态表示

我们写动态规划问题会创建一个名为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]);
    }

}
相关推荐
CM莫问9 分钟前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
康谋自动驾驶1 小时前
康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX
人工智能·科技·算法·机器学习·自动驾驶·汽车
C++ 老炮儿的技术栈2 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
yychen_java2 小时前
R-tree详解
java·算法·r-tree
MarkHard1233 小时前
Leetcode (力扣)做题记录 hot100(62,64,287,108)
算法·leetcode·职场和发展
一只鱼^_4 小时前
牛客练习赛138(首篇万字题解???)
数据结构·c++·算法·贪心算法·动态规划·广度优先·图搜索算法
一只码代码的章鱼4 小时前
Spring的 @Validate注解详细分析
前端·spring boot·算法
邹诗钰-电子信息工程4 小时前
嵌入式自学第二十一天(5.14)
java·开发语言·算法
↣life♚4 小时前
从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation & Promptable Segmentation
人工智能·深度学习·算法·sam·分割·交互式分割
zqh176736464695 小时前
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
人工智能·算法·阿里云·人工智能工程师·阿里云acp·阿里云认证·acp人工智能