代码随想录算法训练营第36天

27 阅读1分钟

509.斐波那契数

class Solution:
    def fib(self, n: int) -> int:
        #新建一个备忘录,来解决重叠子问题
        #初始化备忘录,初始化值-1
        memo=[-1]*(n+1)
        return self.dp(n,memo)
    def dp(self,n,memo):
        #base case
        if n==0 or n==1:
            return n
        if memo[n] != -1:
            return memo[n]
        memo[n]=self.dp(n-1,memo)+self.dp(n-2,memo)
        return memo[n]

70.爬楼梯

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==1:
            return n
        dp=[0]*(n+1)
        dp[1]=1
        dp[2]=2
        for i in range(3,len(dp)):
            dp[i]=dp[i-1]+dp[i-2]
        
        return dp[n]

746.使用最小花费爬楼梯

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        #最重要的就是找到状态转移函数和初始化
        dp=[0]*(len(cost)+1)
        dp[0]=0
        dp[1]=0
        for i in range(2,len(dp)):
            dp[i]=min((dp[i-1]+cost[i-1]),(dp[i-2]+cost[i-2]))
        return dp[len(cost)]