动态规划问题 leetcode之最小花费爬楼梯

175 阅读3分钟

动态规划最小花费爬楼梯

哈喽哈喽,小白又来刷leetcode了,今天我要分享的是动态规划,最小花费爬楼梯的问题。

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

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

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

 

示例 1:

输入: cost = [10,15,20]
输出: 15
解释: 你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:

输入: cost = [1,100,1,1,1,100,1,1,100,1]
输出: 6
解释: 你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

 

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

题解

/**
 * @param {number[]} cost
 * @return {number}
 */
var minCostClimbingStairs = function(cost) {
    const n=cost.length
    const dp=new Array(n+1)
    dp[0]=dp[1]=0
    for(let i=2;i<=n;i++)
    {
        dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
    }
    return dp[n]
};

动态规划

动态规划(Dynamic Programming,简称DP)是一种解决问题的数学方法,它通常用于优化问题,其中问题被分解成子问题,并且子问题的解被缓存,以避免重复计算。DP的核心思想是将一个问题分解为相互重叠的子问题,并通过保存已解决子问题的解来避免重复计算。

动态规划通常在具有重叠子问题和最优子结构性质的问题中发挥作用。重叠子问题意味着问题可以被分解为相似的子问题,而最优子结构性质表示问题的最优解可以通过最优子问题的组合得到。

动态规划的一般步骤包括:

  1. 定义子问题: 将原问题分解为较小的子问题。
  2. 找到状态转移方程: 建立子问题与原问题之间的关系,即状态转移方程。
  3. 确定边界条件: 确定问题的基本情况,通常是最小的子问题的解。
  4. 自底向上或自顶向下求解: 使用递归或迭代的方法解决问题。

动态规划广泛应用于许多领域,如算法设计、优化问题、资源分配等。在算法竞赛和面试中,经常会遇到需要使用动态规划来解决的问题,例如最长公共子序列、背包问题、最短路径问题等。

以下是一个简单的例子,说明动态规划的思想。假设有一个问题,要计算斐波那契数列的第n个数。可以使用动态规划来优化计算过程:

pythonCopy code
def fibonacci(n):
    if n <= 1:
        return n

    # 创建一个数组来保存已经计算过的子问题的解
    dp = [0] * (n + 1)
    dp[1] = 1

    # 通过迭代计算子问题的解
    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]

    # 返回原问题的解
    return dp[n]

# 示例
result = fibonacci(5)
print(result)  # 输出:5

在这个例子中,通过动态规划,避免了重复计算斐波那契数列的子问题,提高了计算效率。

image.png