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

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

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

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

你可能感兴趣的:(动态规划,动态规划,leetcode,算法)