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

动态规划解析:以最小花费爬楼梯为例

动态规划的核心思想

动态规划(DP)通过将复杂问题分解为相互重叠的子问题,并存储子问题的解(避免重复计算),最终高效求解原问题。它适用于具有以下特征的问题:

  1. 重叠子问题:子问题被重复计算多次。

  2. 最优子结构:问题的最优解包含子问题的最优解。

动态规划的解题步骤
  1. 定义状态:用数组 dp[i] 表示到达第 i 级台阶的最小花费。

  2. 确定状态转移方程:基于子问题关系推导递推式。

  3. 设置初始条件:初始化基础状态(如 dp[0]dp[1])。

  4. 迭代计算:按顺序从小问题向大问题递推。

实例分析:LeetCode 746. 最小花费爬楼梯

问题描述
给定整数数组 costcost[i] 表示踏上第 i 级台阶的代价。每次可以爬 1 或 2 级台阶,求到达顶部(数组末尾之后)的最小花费。

关键思路

  • 状态定义dp[i] 表示到达第 i 级台阶的最小花费(注意:顶部是第 n 级,n = cost.length)。

  • 状态转移
    到达第 i 级有两种方式:

    1. 从第 i-1 级爬 1 步:花费 = dp[i-1] + cost[i-1]

    2. 从第 i-2 级爬 2 步:花费 = dp[i-2] + cost[i-2]
      取两者最小值:
      dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])

  • 初始条件

    • 起点为第 0 级或第 1 级(花费为 0):
      dp[0] = 0dp[1] = 0

  • 目标:计算 dp[n]n 是台阶总数)。

示例说明
若 cost = [10, 15, 20]

  • dp[0] = 0dp[1] = 0(初始站在第0或第1级)

  • dp[2] = min(0+10, 0+15) = 10(从第0级跨2步)

  • dp[3] = min(10+15, 0+20) = 20(从第1级跨2步)

  • 最小花费为 dp[3] = 20

    class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;int[] dp = new int[n + 1];  // dp[i] 表示到达第 i 级的最小花费dp[0] = 0;  // 初始站在第0级,花费0dp[1] = 0;  // 初始站在第1级,花费0for (int i = 2; i <= n; i++) {// 从 i-1 级爬1步,或从 i-2 级爬2步dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[n];  // 到达顶部(第n级)的最小花费}
    }

    复杂度分析

  • 时间复杂度:$O(n)$,遍历一次数组。

  • 空间复杂度:$O(n)$,使用长度为 $n+1$ 的 DP 数组。

优化空间复杂度

实际只需保留前两个状态,将空间优化至 $O(1)$:

class Solution {public int minCostClimbingStairs(int[] cost) {int a = 0, b = 0;  // a = dp[i-2], b = dp[i-1]for (int i = 2; i <= cost.length; i++) {int c = Math.min(b + cost[i - 1], a + cost[i - 2]);a = b;  // 更新前两级状态b = c;  // 更新前一级状态}return b;}
}
动态规划的适用场景
  1. 最值问题:如最短路径、最小花费。

  2. 计数问题:如路径总数。

  3. 序列决策问题:如背包问题、股票买卖。

掌握动态规划的核心在于识别子问题关系,并通过状态转移方程将问题拆解为可管理的部分。通过练习经典问题(如爬楼梯、背包问题),能逐步培养DP思维!

http://www.dtcms.com/a/298781.html

相关文章:

  • 纸板留声机:用ESP32和NFC打造会唱歌的复古装置
  • SeaweedFS深度解析(四):裸金属单机部署之配置文件启动master服务
  • IMU的精度对无人机姿态控制意味着什么?
  • [特殊字符] 第9篇:《SQL高阶 SELECT 技巧:DISTINCT、ORDER BY、LIMIT 全家桶》
  • ComfyUI中运行Wan 2.1工作流,电影级视频,兼容Mac, Windows
  • java微操
  • NLP验证自动化脚本优化
  • 硬核接线图+配置步骤:远程IO模块接入PLC全流程详解
  • 前端开发 Vue 状态优化
  • 多场景通用车辆计数算法助力暑期交通管理
  • Java从入门到精通!第十四天,重点!(反射)
  • 20250725-day22
  • Ivanti Endpoint Manager Mobile 远程命令执行漏洞复现(CVE-2025-4427)
  • 壁纸管理 API 文档
  • 测试实时性内核参数配置
  • 如何阅读字节码文件
  • Arrays 工具类详解
  • 在线事务型的业务、实时分析类业务、离线处理类型的业务
  • C语言————原码 补码 反码 (超绝详细解释)
  • 【循环语句,求100内能被6整除的和】
  • 群晖 File Station:集中浏览与管理 NAS 文件的工具
  • 60个Java与Spring核心知识点详解
  • [Java恶补day46] 整理模板·考点九【二叉树最近公共祖先】
  • 跨境电商流量密码:自养号测评采购技术,低成本撬动高转化
  • agent含义、起源、定义、分类、应用场景以及未来趋势
  • 机器学习入门
  • 从 “能打” 到 “顶尖”:DeepSeek-V3 后训练拆解,微调 + 强化学习如何让大模型脱胎换骨?
  • html+js列表分页功能封装
  • Kubernetes服务发布进阶
  • GPT - 5被曝将在8月初发布!并同步推出mini、nano版