代码随想录算法训练营第三十八天|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

news/2024/12/22 23:42:11/

文章目录

      • 理论基础
      • 509. 斐波那契数
      • 70. 爬楼梯
      • 746. 使用最小花费爬楼梯

理论基础

  • 动态规划-DP

    1. 动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的

    2. 背包问题:
      动态规划中dp[j]是由dp[j-weight[i]]推导出来的,然后取max(dp[j], dp[j - weight[i]] + value[i])。
      但如果是贪心呢,每次拿物品选一个最大的或者最小的就完事了,和上一个状态没有关系。

  • 动规五步

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

    2. 确定递推公式

    3. dp数组如何初始化

    4. 确定遍历顺序

    5. 举例推导dp数组

509. 斐波那契数

  • 解题思路:
    1.确定递推公式 => dp[i] = dp[i - 1] + dp[i - 2];
    2.确定遍历顺序 => 从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],
    那么遍历的顺序一定是从前到后遍历的
    3.举例推导dp数组
public int fib(int n) {if(n <= 1){return n;}int[] dp = new int[2];dp[0] = 0;dp[1] = 1;int sum = 0;for (int i = 2; i <= n; i++) {sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum; }return sum;
}

70. 爬楼梯

  • 解题思路:
    ①确定dp数组:dp[i]: 爬到第i层楼梯,有dp[i]种方法
    ②递推公式:dp[i] = dp[i - 1] + dp[i - 2],dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法;
    dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法
    在推导dp[i]的时候,一定要时刻想着dp[i]的定义,否则容易跑偏
    ③初始化:不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义
    ④遍历顺序:从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的
public int climbStairs(int n) {if(n <= 1){return n;}//dp数组int[] dp = new int[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. 使用最小花费爬楼梯

  • 解题思路:
    1.dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。
    2.确定递推公式:可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[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; 到达 第 0 个台阶是不花费的
    4.确定遍历顺序,从前向后遍历
public int minCostClimbingStairs(int[] cost) {//不用加判断// if(cost.length == 2){//     return 0;// }//注意:最后一步也要花费//dp数组int[] dp = new int[cost.length + 1];//初始化dp[0] = 0;dp[1] = 0;//遍历for (int i = 2; i <= cost.length; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.length];
}

http://www.ppmy.cn/news/48271.html

相关文章

Progress ThemeBuilder crack

Progress ThemeBuilder crack 自定义输入将覆盖自定义日期输入和下拉列表。 Fluent主题中的图表不应用系列颜色。 撤消重做操作会导致重复以前编辑过的变量。 拆分器折叠的拆分条模板错误。 ThemeBuilder是一个多功能工具&#xff0c;可以帮助您创建视觉样式&#xff0c;并将其…

Redis缓存MySQL数据库存储二者如何保证数据一致性

文章目录 Redis缓存MySQL数据库存储二者如何保证数据一致性数据一致性问题缓存穿透缓存雪崩 Redis缓存MySQL数据库存储一致性解决方案方案一&#xff1a;读写数据库时同步更新缓存方案二&#xff1a;使用消息队列异步更新缓存 总结 Redis缓存MySQL数据库存储二者如何保证数据一…

背锅侠?软件测试各类bug分类定位,从功能到性能超细总结......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 遇到功能性问题&a…

软件测试概念篇(下)|开发模型与测试模型

作者&#xff1a;爱塔居 专栏&#xff1a;软件测试 作者简介&#xff1a;大三学生&#xff0c;希望同大家一起进步&#xff01; 文章简介&#xff1a;主要介绍软件生命周期、瀑布模型和螺旋模型两个开发模型&#xff0c;V模型和W模型两个测试模型 文章目录 目录 文章目录 一、软…

IOC容器与DI依赖注入示例

IOC容器与DI依赖注入示例 IOC深入理解IOC示例&#xff1a; DI深入理解DI示例 IOC深入理解 我们先通过几个问题来加深一下对IOC的理解 (1)Spring是使用IOC容器来管理bean对象的&#xff0c;我们主要管理什么? 主要管理项目中所使用到的类对象&#xff0c;比如(Service层对像和…

在现成的3D打印机上进行实验理论:一种数据孪生的攻击探测框架

在现成的3D打印机上提供了一种DT中攻击探测框架的DT解决方案的实验演示&#xff0c;作为说明性CPMS资源。通过网络安全DT对打印机正常运行、异常运行和攻击三种情况下的实验数据进行收集和分析&#xff0c;得出攻击检测结果。实验装置概述如下图所示。该实验研究是在现实世界设…

tokenURI的实现方式

做数字藏品最重要的function是tokenURI(tokenId)。 实现1 基本路径tokenID ERC721 function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {_requireMinted(tokenId);string memory baseURI _baseURI();return bytes(baseURI).length &…

HarmonyOS原子化服务卡片整改、下架、升级失败部分原因及处理办法

随着HarmonyOS应用体系相关规则、团队的不断发展和完善&#xff0c;早期上架运营的HarmonyOS原子化服务卡片&#xff0c;很多都收到了整改、下架的通知&#xff0c;主要集中在用户协议、隐私声明、服务卡片的设计规范性等细节方面的问题&#xff1b;需要进行优化调整升级才行。…