【每日算法】动态规划二
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]