DAY42动态规划

news/2024/7/6 2:32:54

动态规划

509. 斐波那契数

509. 斐波那契数

题目描述

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

思路

1.确定dp数组以及下标的含义

dp[i]:i 对应的斐波那契数为 F(i)

2.确定递推公式

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

3.dp数组如何初始化

dp[0] = 0
dp[1] = 1

4.确定遍历顺序

for (i = 2; i <= n; i ++){…}
return dp[n]

5.举例推导dp数组

代码

class Solution {
 public:
     int fib(int n) {
     	//新加:对n判断直接return
        if (n <= 1)    return n;
        vector<int> dp(n + 1);
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++)
        {
            dp[i] = dp [i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

70. 爬楼梯

70. 爬楼梯

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

思路

1.确定dp数组以及下标的含义

dp[i] :有dp[i]种方法爬到第 i 级楼梯上

2.确定递推公式

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

3.dp数组如何初始化

dp[1] = 1
dp[2] = 2

4.确定遍历顺序

for (int i = 3; i <= n; i++){}
return dp[n];

5.举例推导dp数组

代码

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 2) return n;
        vector<int> dp(n+1);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++)
        {
            dp[i] = dp[i - 1] + dp[i-2];
        }
        return dp[n];
    }
};

746. 使用最小花费爬楼梯

题目描述

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

思路

注意dp[i]含义

1.确定dp数组以及下标的含义

dp[i + 1],到达第i个台阶之上所需最低花费
dp[i] 实际代表第 i 级台阶的水平线,即站在第 i 级台阶前还没有向上跳

2.确定递推公式

dp[i] = min (dp [i - 1] + cost [i - 1],dp [i - 2] + cost [i - 2])

3.dp数组如何初始化

dp[0] = 0;
dp[1] =0;

4.确定遍历顺序

for (int i = 2; i <= n; i++){}
return dp[n];

5.举例推导dp数组

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    总花费为 15 。
    dp[0] = 0;
    dp[1] = 0;
    dp[2] = min(10,15) = 10;
    dp[3] = min(30, 15) =15;

代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        if (n <= 1)   return 0;
        vector<int> dp(n + 1);
        dp[0] = 0;
        dp[1] = 0;
        for(int i = 2; i <= n; i++)
        {
            dp[i] = min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);
        } 
        return dp[n];
    }
};

http://lihuaxi.xjx100.cn/news/1294701.html

相关文章

量子 能源,节能减排还是另有“端倪”?

光子盒研究院 前言&#xff1a;如今&#xff0c;量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域&#xff1b;创新赛道上&#xff0c;加速奔跑的量子产业&#xff0c;将带来无限可能。现在&#xff0c;光子盒特开启「量子」专栏&#xff0c;解读量子技术将为下游应…

华为智能高校出口安全解决方案(1)

华为智能高校出口安全解决方案&#xff08;1&#xff09; 视频链接方案背景需求分析高校园区网概述高校园区网全景高校出口场景介绍高校出口整体需求分析业务安全需求攻击防御需求运维审计需求 方案规划华为智能高校出口安全解决方案架构华为智能高校出口安全解决方案功能划分业…

实用类详解

第二章 实用类介绍 目录 第二章 实用类介绍 1.枚举 2.包装类及其构造方法 3.Math类 4.Random类 5.String类 6.StringBuffer类 7.操作日期时间 总结 内容仅供学习交流&#xff0c;如有问题请留言或私信&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

threejs 入门 (vite + vue3)

threejs threejs用于实现3D效果 vite创建vuejs项目 npm create vite选择vue 和js创建vue3项目 安装threejs npm install three运行项目 cd project npm i npm run dev修改App.vue 创建一个场景和立方体&#xff08;Creating a scene&#xff09; <script setup> …

点分治及其例题

点分治 处理树上问题&#xff0c;将问题范围分为穿过树根的与子树内部 对于子树内部采用递归处理&#xff0c;对穿过树根具体题目具体分析 为了让递归层数尽量少&#xff0c;先要找重心 找重心&#xff1a; 重心为所有子树的最大值最小的节点 用 s z [ i ] sz[i] sz[i]记…

分享如何安全运营多个eBay卖家账号的实用方法

“我们在eBay上已经销售了20多年&#xff0c;有多个eBay账户。但我们的一个小账户最近收到了限制通知&#xff0c;所以我们提供了必要的文件。然而&#xff0c;我们震惊地发现&#xff0c;我们的账户被永久暂停。我们的另外两个账户也被限制销售。"一位eBay用户分享道。 在…

AscendCL运行时资源异常问题案例

AscendCL&#xff08;Ascend Computing Language&#xff09;是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库&#xff0c;该API库中提供运行资源管理、内存管理等基础API。 本期就分享几个关于运行资源管理、内存管理等基础API问题的典型案例&#xff0c;并给出…

AutoSAR系列讲解(入门篇)4.2-BSW的I/O功能

一、架构与术语解释 这里主要是说I/O的功能&#xff0c;而其中会用到一些模块&#xff0c;下面途中我将用到的模块都高亮显示了&#xff0c;并且放大到了右边的途中展示其中的子模块&#xff08;该子模块就是BSW中最小的单位了&#xff0c;如其中的ADC子模块&#xff09;。这里…