算法基础Day7(动态规划)

文章目录

1.题目

  1. 1137. 第 N 个泰波那契数 - 力扣(LeetCode)
  2. 面试题 08.01. 三步问题 - 力扣(LeetCode)

2.题目解答

1.第N个泰波那契数

题目及题目解析

动态规划算法学习

1.状态表示
  1. 状态表示 是什么

    状态表示值得是dp表里的值的含义

  2. 怎么来的

    1. 题目要求
    2. 经验和题目要求
    3. 分析问题的过程中,发现重复子问题
2.状态转移方程

dpi等于什么

例如本题直接给出来了:

3.初始化

本质就是:保证填表不越界,根据状态转移方程进行填表

cpp 复制代码
//创建dp表
vector<int> dp(n+1);
//dp初始化
dp[0]=0,dp[1]=dp[2]=1;
4.填表顺序

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

本题的状态为:从左向右

cpp 复制代码
//填表
for(int i =3;i<=n;i++)
{
    dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
}
5.空间优化

动态规划的空间优化一般都为滚动数组

就是填报的这部分的代码要修改

cpp 复制代码
class Solution {
public:
    int tribonacci(int n) {
        // 处理边界问题
        if (n == 0)
            return 0;

        if (n == 1 || n == 2)
            return 1;

        // 空间优化
        int a = 0, b = 1, c = 1, d = 0;
        // 填表
        for (int i = 3; i <= n; i++) 
        {
            d = a + b + c;
            a = b;
            b = c;
            c = d;
        }
        // 返回
        return d;
    }
};

代码提交

cpp 复制代码
class Solution {
public:
    int tribonacci(int n) {
        //处理边界问题
        if(n==0)
        {
            return  0;
        }
        if(n == 1||n == 2)
        {
            return 1;
        }
        //创建dp表
        vector<int> dp(n+1);
        //dp初始化
        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];
    }
};

空间优化

2.三步问题

题目及题目解析

算法学习

这里我们可以找一下这里的规律:

可以发现后面的数和前面的数是为前三个数字之和

所以就可以直接用动态规划进行解决这道题

但是要注意这里没进行一次相加就要对相加的数进行取模

dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD

这部分代码如下:

cpp 复制代码
vector<int> dp(n+1);
dp[1] = 1, dp[2] = 2, dp[3] = 4;
for (int i = 4; i <= n; i++) {

    dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;
}
return dp[n];

代码提交

cpp 复制代码
class Solution {
public:
    int waysToStep(int n) {
        const int MOD = 1e9+7;

        if (n == 1 || n == 2) {
            return n;
        }
        if (n == 3) {
            return 4;
        }

        vector<int> dp(n+1);
        dp[1] = 1, dp[2] = 2, dp[3] = 4;
        for (int i = 4; i <= n; i++) {

            dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;
        }
        return dp[n];
    }
};
相关推荐
m0_720245011 小时前
1543.统计好三元组(简单)
开发语言·算法
To_OC2 小时前
LC 560 和为 K 的子数组:前缀和配哈希表,这对组合我是真的服了
javascript·算法·程序员
hans汉斯2 小时前
《软件工程与应用》期刊推荐&10月版面征稿中
图像处理·人工智能·深度学习·算法·音视频·软件工程
叠层归一研究院3 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
其美杰布-富贵-李4 小时前
08 进阶评估指标与算法特定指标
人工智能·算法
.道阻且长.4 小时前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展
我是海飞4 小时前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
wabs6665 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
Tasiorh6 小时前
《基于LSTM-RNN-CBAM模型和动态规划模型的交易策略》
rnn·lstm·动态规划
lsylalalala7 小时前
常见的排序算法1
数据结构·算法·排序算法