算法基础Day7(动态规划)

ops/2024/12/12 17:35:42/

在这里插入图片描述

文章目录

  • 1.题目
  • 2.题目解答
    • 1.第N个泰波那契数
      • 题目及题目解析
      • 动态规划算法学习
        • 1.状态表示
        • 2.状态转移方程
        • 3.初始化
        • 4.填表顺序
        • 5.空间优化
      • 代码提交
      • 空间优化
    • 2.三步问题
      • 题目及题目解析
      • 算法学习
      • 代码提交

1.题目

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

2.题目解答

1.第N个泰波那契数

题目及题目解析

1733878252795

1733878762250

动态规划算法学习

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

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

    1733880203776

  2. 怎么来的

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

dp[i]等于什么

例如本题直接给出来了:

1733880407188

3.初始化

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

1733880608205

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

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

本题的状态为:从左向右

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

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

1733884583516

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

1733884672411

1733885642892

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;}
};

代码提交

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.三步问题

题目及题目解析

1733885748968

算法学习

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

1733897234309

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

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

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

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

这部分代码如下:

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];

代码提交

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];}
};

http://www.ppmy.cn/ops/141296.html

相关文章

浅谈身份证二要素实名认证接口C#集成方式、核验返回示例

身份证实名认证二要素信息接口&#xff0c;是一种通过提供身份证号码和姓名这两个要素&#xff0c;进行实时核验和比对的身份认证服务。翔云身份证号实名认证接口与权威数据源对接&#xff0c;验证用户所提供的身份证信息是否与公安系统中的真实数据一致&#xff0c;从而判断该…

Day11 洛谷 1307+1321+1482

零基础洛谷刷题记录 Day01 2024.11.18 Day02 2024.11.25 Day03 2024.11.26 Day04 2024.11.28 Day05 2024.11.29 Day06 2024 12.02 Day07 2024.12.03 Day08 2024 12 05 Day09 2024.12.07 Day10 2024.12.09 Day11 2024 .12.10 文章目录 零基础洛谷刷题记录1307&#xff1a;题目描…

【数据结构】B树家族解析:B树、B+树与B*树的理论与B树插入实现(C++)

文章目录 一、常见的搜索结构二、B树2.1 B树概念2.2 开销 三、代码实现3.1 B树节点的设计3.2 B树设计3.3 插入操作实现1. 查找插入位置&#xff08;Find 函数&#xff09;2. 插入关键字到节点&#xff08;InsertKey 函数&#xff09;3. 处理节点分裂&#xff08;Insert 函数&am…

docker中安装minio

1.首先需要搜索可用镜像&#xff0c;当然也可以不用 docker search minio/minio 2.拉取镜像 docker pull minio/minio 3.在本地新建两个文件夹路径 mkdir -p /opt/minio/datamkdir -p /opt/minio/config解释一下&#xff0c;data是文件存储的首路径。config是配置路径&…

虚幻引擎开发命名规则

UE的命名规则如下&#xff1a; 模版类以T作为前缀&#xff0c;例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头&#xff0c;如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀&#xff0c;如bPe…

HTTP的详解

HTTP 的基本概念 &#xff08;1&#xff09;定义 HTTP&#xff08;超文本传输协议&#xff0c;HyperText Transfer Protocol&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说&#xff0c;它是在互联网上进行数据传输的规则&#xff0c;主要用于客…

Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)

本篇文章详细给大家介绍Ansible变量&#xff0c;变量适合管理剧本中每个项目的动态值&#xff0c;或是某些值在多个地方重复使用&#xff0c;如果将此值设置为变量再在其他地方调用会方便许多。会用变量&#xff0c;才算真正会用Ansible&#xff0c;话不多说&#xff0c;直接开…

Go validator验证参数是否零值以及是否传递

一&#xff1a;问题场景​ 在Go中&#xff0c;当使用encoding/json包解码JSON数据到结构体时&#xff1a; 如果前端未传递某个字段&#xff0c;validator会将该字段设置为其类型的零值。如果前端传递了该字段&#xff0c;并且是零值&#xff0c;validator同样会将其设置为相应…