动态规划之爬楼梯和最小花费爬楼梯

动态规划

  • 动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。

  • 首先,我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解。

1.爬楼梯

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

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

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

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

来源: 力扣(LeetCode)70题
思路分析:
此题为典型的动态规划的问题,我们先想一个问题,当我们一次只能上1个或者2个台阶,那么当我们上到第2层台阶有几种方式?首先第一种选择一次一层,第二种一次两节直接到达,那么当我们想要上到第n层时,其实也是从n-2或者n-1登上来,用公式表示则是:n = (n-1)+(n-2)

有了这种思想我们来解决下这道题:

var climbStairs = function(n) {
    
    
	//当n=1或者n=2时,直接返回
    if(n == 1 || n == 2){
    
    
        return n;
    }else{
    
    
        var arr = [];
        arr[1] = 1;
        arr[2] = 2
        for(i = 3;i<=n;i++){
    
    
             arr[i] = arr[i-1]+arr[i-2]
        }
    }
    return arr[n]
};

2.最小花费爬楼梯:

题目:
给你一个整数数组 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 。

来源: 力扣(LeetCode)746题

思路分析:这道题与上面那道有相似处,但是其实这道题难度是比上一道要大的,首先思路是一样的当我们到达第 n层时,有两种方式:

  • 从n-2选择一次两层到达n层
  • 从n-1选择一次一层到达n层

具体要怎样选择呢,我们就要找到n-1与n-2中的最小值,所以此题的核心公式为:n = min((n-1),(n-2))代码如下:

var minCostClimbingStairs = function(cost) {
    
    
    var len = cost.length
    for(var i = 2; i<len ; i++){
    
    
        cost[i]+=Math.min(cost[i-1],cost[i-2])
    }
    return Math.min(cost[i-1],cost[i-2])
};

猜你喜欢

转载自blog.csdn.net/qq_52648305/article/details/124334573