【每日算法】动态规划二

70.爬楼梯

难度: 【简单】

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

到达第n个台阶时,可以在n-1的台阶上爬1个台阶到达,也可以在n-2的台阶上爬2个台阶到达。定义f(n)为到达第n个台阶的爬楼方法,因此f(n)=f(n-1)+f(n-2)。
初始化: f(0)=1,f(1)=2

class Solution(object):
    def climbStairs(self, n):
        # f(n)=f(n-1)+f(n-2)
        if n<=2:
            return n
        #因为只和前两个元素有关系,则直接定义两个元素即可
        a,b=1,2
        for i in range(2,n):
            t=a
            a,b=b,t+b
            # print(a,b)
        return b
    def climbStairs2(self, n):
        # f(n)=f(n-1)+f(n-2)
        if n<=2:
            return n
        dp=[0]*n
        dp[0]=1
        dp[1]=2
        # print(dp)
        for i in range(2,n):
            dp[i]=dp[i-1]+dp[i-2]
        return dp[-1]

746.使用最小花费爬楼梯

难度: 【简单】

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。

请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

示例 1:

输入:cost = [10, 15, 20]
输出:15
解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。
 示例 2:

输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出:6
解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。

当站在一个台阶上时,消耗台阶上的体力值就可以往上爬1个或2个台阶,问到达顶部时怎样才能消耗最小的体力值。

定义f(n)为到达n个台阶时消耗的最小体力值,f(n)=min(f(n-1)+c[i-1],f(n-2)+c[i-2])
初始值: f(0)=c[0],f(1)=c[1]

class Solution(object):
    def minCostClimbingStairs(self, cost):
        n=len(cost)
        dp=[0]*(n+1)
        # dp[0]=cost[0]
        # dp[1]=cost[1]
        for i in range(2,n+1):
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
        return dp[-1]
posted @ 2021-08-11 18:10  Hitechr  阅读(44)  评论(0编辑  收藏  举报