【动态规划】——斐波那契数列模型

文章目录:

1. 动态规划

1.1:动态规划的基本步骤

2. 斐波那契数列模型例题

2.1:第n个泰波那契数

2.1.1:算法思想

2.1.2:空间优化

2.2:三步问题

2.2.1:算法思想

2.2.2:注意

2.3:使用最小花费爬楼梯

2.3.1:本题的小误区之楼梯顶在哪里?

2.3.2:算法思想

2.3.3:解法二

2.4:解码方法

2.4.1:算法思想

2.4.2:优化


1. 动态规划

动态规划(Dynamic Programming, DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。它通常用于优化问题。

动态规划直接从定义等方面理解起来,或许会有些晦涩难懂,所以选择直接从题目入手,通过60道动态规划相关例题,由易到难,由浅入深的感受动态规划。

1.1:动态规划的基本步骤

        1. 状态表示:

                a. 创建一个dp表(通常是一个数组)

                b. 填满dp表,dp表的每一个值就是一个状态

                c. 定义状态表示的方法:

                        i. 题目要求

                        ii. 经验 + 题目要求:

                                1)以某一个位置 i 作为起始

                                2)以某一个位置 i 作为结束

                        iii. 分析问题的过程中,发现了重复子问题

        2. 状态转移方程:根据状态表示得出状态转移方程

                用之前或之后的状态推导出dp[ i ] 的值

                通常:根据最近的一步来划分问题

        3. 初始化:保证填表的时候不发生越界

                只需要初始化可能发生越界的状态

        4. 填表顺序:根据状态转移方程和边界条件,确定子问题的求解顺序

                通常是从下到上、从左到右(或称为从小到大)地计算状态值。

        5. 返回值

了解了动态规划的一般流程;

那么,现在开始,进入动态规划的第一个模型——斐波那契数列模型

注:以下题目全部取自力扣!!!

2. 斐波那契数列模型例题

2.1:第n个泰波那契数

【动态规划】——斐波那契数列模型_第1张图片

2.1.1:算法思想

        1. 状态表示:

                a. 创建一个dp表:本题是一个一维数组

                b. 定义状态表示:

                        i. 本题用到 题目要求:dp[ i ]为第i个泰波那契数

        2. 状态转移方程:根据状态表示得出状态转移方程

                本题:由题目给出 dp[ i ] = dp[ i-1 ]+dp[ i-2 ]+dp[ i-3 ]

        3. 初始化:保证填表的时候不发生越界

                本题:dp[ 0 ]:代入方程会产生:dp[ -1 ]、dp[ -2 ]、dp[ -3 ]

                          dp[ 1 ]:dp[ -1 ]、dp[ -2 ]

                          dp[ 2 ]:dp[ -2 ]

                        只需要初始化dp[ 0 ]、dp[ 1 ]、dp[ 2 ]

        4. 填表顺序:

                为了填写当前状态时,所需的状态已经计算过了

                本题:从左到右

        5. 返回值:第n个泰波那契数:dp[ n ]

代码实现:

    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;i++){
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        }
        return dp[n];

        //时间复杂度 O(N)
        //空间复杂度 O(N)

    }<

你可能感兴趣的:(算法,动态规划,动态规划,算法,java)