当前位置: 首页 > news >正文

力扣热题100------70.爬楼梯

动态规划法:

动态规划法介绍:

动态规划(Dynamic Programming,简称 DP)是一种用于解决多阶段决策问题的算法思想,它通过将复杂问题分解为更简单的子问题,并存储这些子问题的解以避免重复计算,从而高效地解决问题。动态规划通常用于优化问题,尤其是那些具有重叠子问题和最优子结构特性的问题。

核心概念

• 最优子结构:

• 一个问题的最优解可以由其子问题的最优解组合而成。换句话说,问题的解可以分解为若干个子问题的解。

• 例如,在爬楼梯问题中,到达第(n)阶的方法数可以由到达第(n-1)阶和第(n-2)阶的方法数组合而成。

• 重叠子问题:

• 在递归求解过程中,同一个子问题会被多次计算。动态规划通过存储这些子问题的解(通常使用一个数组或哈希表),避免重复计算,从而提高效率。

• 例如,在递归计算斐波那契数列时,会多次计算相同的值,而动态规划通过存储这些值来避免重复计算。

动态规划的优势
• 高效性:

• 动态规划通过存储子问题的解,避免了重复计算,大大提高了算法的效率。时间复杂度通常为(O(n))。

• 适用性:

• 动态规划适用于具有重叠子问题和最优子结构特性的问题,如背包问题、最长公共子序列、最短路径问题等。

• 可扩展性:

• 动态规划的思想可以扩展到多维问题,通过增加状态维度来解决更复杂的问题。

动态规划的局限性
• 空间复杂度:

• 动态规划通常需要额外的空间来存储子问题的解,空间复杂度可能较高。例如,爬楼梯问题的空间复杂度为(O(n))。

• 状态转移方程的推导:

• 动态规划的关键在于推导状态转移方程,这需要对问题有深入的理解和分析。

• 适用范围:

• 动态规划只适用于具有重叠子问题和最优子结构特性的问题,对于不符合这些特性的问题,动态规划可能不适用。

总结

动态规划是一种强大的算法思想,通过将复杂问题分解为更简单的子问题,并存储这些子问题的解,避免重复计算,从而高效地解决问题。爬楼梯问题是动态规划的经典应用之一,通过定义状态、初始化状态、状态转移和计算顺序,可以高效地求解问题。

案例

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

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

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示:

1 <= n <= 45

思路:采用动态规划法 在n为1的时候 只有一种方法能到达 在n为2的时候 有两种方式可以到达 在n大于3之后就有f(n)=f(n-1)+f(n-2)种方法到达 所以f(n)就是我们要求的答案

  1. 定义状态:• 使用数组 dp ,其中 dp[i] 表示到达第 i 阶的方法数。
  2. 初始化状态:• dp[1] = 1 • dp[2] = 2
  3. 状态转移:• 对于 i \geq 3 ,根据状态转移方程更新:
    状态转移方程就为f(n)=f(n-1)+f(n-2)
  4. 计算顺序:• 从第 3 阶开始,逐步计算到第 n 阶。
  5. 返回结果:• 最终结果为 dp[n] 。
class Solution {public int climbStairs(int n) {if(n<=2){return n;}int[] fire=new int[n+1];fire[1]=1;fire[2]=2;for(int i=3;i<n+1;i++){fire[i]=fire[i-1]+fire[i-2];}return fire[n];}
}
http://www.dtcms.com/a/323163.html

相关文章:

  • 从零学习three.js官方文档(一)——基本篇
  • 每日五个pyecharts可视化图表-line:从入门到精通
  • 记录一次ubuntu20.04 解决gmock not found问题的过程
  • Spring 框架中提供Aware接口,实现感知容器对象
  • 机器学习——模型的简单优化
  • CPU缓存(CPU Cache)和TLB(Translation Lookaside Buffer)缓存现代计算机体系结构中用于提高性能的关键技术
  • 盟接之桥说制造:以品质为基,消费者导向差异而生
  • Linux系统编程Day10 -- 进程管理
  • CTF常用工具汇总(二)
  • 【32】C#实战篇——两个文件夹下 相同名字的文件 进行配对(两个文件夹下的文件数量和文件类型不一定相同,所以要过滤掉我们不要的文件)
  • ArkUI中的布局组件Row(一)
  • 计算机网络1-6:计算机网络体系结构
  • 【Python 高频 API 速学 ④】
  • Office安装使用?借助Ohook开源工具?【图文详解】微软Office产品
  • 使用 Conda 安装 xinference[all](详细版)
  • 一个“加锁无效“的诡异现象
  • Java 日志从入门到精通:告别日志混乱
  • C++高性能细粒度时间跟踪实战
  • Python基础教程(五)list和tuple:深度剖析Python列表与元组的终极对决
  • PHP-单引号和双引号(通俗易懂讲解版)
  • 卫星遥感与AI大模型
  • JS逆向实战案例之----【通姆】252个webpack模块自吐
  • NFS 挂载失败** 问题(`mount: wrong fs type`),以下是详细的排查步骤和解决方案
  • 20250809在WIN10下使用diskpart命令格式化TF卡【卡刷荣品PRO-RK3566的核心板】
  • 云渲染的未来已来:渲酷云如何重新定义数字内容生产效率
  • SimBA算法实现过程
  • 39.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--调整发布脚本
  • 利用SymPy与SciPy高效求解参数化方程组的数值解
  • [激光原理与应用-207]:光学器件 - 光纤种子源激光器常用元器件
  • 9-DS18B20-verilog驱动