Leetcode-D19-动态规划二刷-509. 斐波那契数&1137. 第 N 个泰波那契数&746. 使用最小花费爬楼梯

509. 斐波那契数

1、第一想法是用一个dp数组,后来想可以用滑动的思想
2、第一次提交的时候忘记讨论n1和n2的情况了。
3、

class Solution:
    def fib(self, n: int) -> int:
        if n==0:
            return 0
        if n==1:
            return 1
        p=0
        q=1
        i=p+q
        for i in range(2,n+1):
            i =p+q
            p=q
            q=i
        return i
```![在这里插入图片描述](https://img-blog.csdnimg.cn/8a0120f313d344acbef780b73962d20d.png)


4、和大佬写的对比一下
https://leetcode-cn.com/problems/fibonacci-number/solution/dong-tai-gui-hua-tao-lu-xiang-jie-by-labuladong/
这篇思路写的太好啦!!!
总结一下:
1、暴力算法其实就是递归,是自顶向下的,里面有很多重复的项;将这些重复的项用memo记录,就可以减少重复;如果自底向上就是动态规划。
2、动态规划特点:求最优解;有最优子结构;状态转移方程
3、大佬写的明显简单不少
n小于2,如何处理;
赋值可以一下子两个值

5、把自己的再精进一下

```bash
class Solution:
    def fib(self, n: int) -> int:
        if n<2:
            return n
        p,q,r=0,0,1
        for i in range(2,n+1):
            p,q=q,r
            r =p+q
        return r

1137. 第 N 个泰波那契数

  1. 和斐波那契差不多,所以改进了自己的代码风格
class Solution:
    def tribonacci(self, n: int) -> int:
        if n==0:
            return 0
        elif n<3:
            return 1
        else:
            p,q,s,r=0,0,1,1
            for i in range(3,n+1):
                p,q,s = q,s,r
                r=p+q+s
            return r

2、和大佬的对比一下,好像我的更加简洁

70. 爬楼梯

1、爬楼梯问题把dp【n】定义为爬n接台阶有几种方法,可以使用滚动的方法。
2、不过,最开始我出现了一个错误。就是在init的时候,2级台阶应该是2种方法,我误认为是1种了。

class Solution:
    def climbStairs(self, n: int) -> int:
        if n<3:
            return n
        p,q,s=0,1,2
        for i in range(3,n+1):
            p,q = q,s
            s = p+q
        return s

在这里插入图片描述

746. 使用最小花费爬楼梯

1、最小花费就很像是动态规划的问题了。
2、稍微有一点小问题出在认为刚开始到第0,1也需要支付费用,其实是不用的。我们是免费地先站在0/1,然后从0/1走,才需要支付相应的cost[0]/cost[1],改正就没问题啦~

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int: 
        n = len(cost)
        if n<2:
            return 0
        p,q,s = 0,0,0
        for i in range(2,n+1):
            p,q = q,s
            s = min(q+cost[i-1],p+cost[i-2])
        return s

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值