day38:|● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

理论基础

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

509. 斐波那契数

1.代码

class Solution {
public:
    int fib(int n) {
        if (n <= 1) return n;
        vector<int>f(n+1 , 0);
        f[0] = 0;
        f[1] = 1;
        for (int i = 2; i <= n; i++) {
            f[i]  = f[i - 1] + f[i - 2];
        }
        return f[n];
    }
};

2.动规五部曲

1.确定递归数组和其下标含义

2.确定递推公式

3.dp数组如何初始化

4.确定遍历顺序

5.举例推导dp数组


70. 爬楼梯

1.代码

class Solution {
public:
    int climbStairs(int n) {
        vector<int>f(n + 5, 0);
        f[1] = 1;
        f[2] = 2;
        if (n <= 2) return f[n];
        for (int i = 3; i <= n; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f[n];
    }
};

2.动规五部曲

1.确定递归数组和其下标含义

2.确定递推公式

3.dp数组如何初始化

4.确定遍历顺序

5.举例推导dp数组

一般在前几个元素或后几个元素推导


746. 使用最小花费爬楼梯

1.代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int>f(cost.size() + 5, 0);
        f[0] = 0;
        f[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            f[i]= min(f[i - 1] + cost[i - 1], f[i - 2] + cost[i - 2]);
        }
        return f[cost.size()];
    }
};

2.动规五部曲

1.确定递归数组和其下标 的含义

注:我们可以对dp数组开大一点的空间

dp[i]相当于在到达i层所花费的最小体力

2.确定递推公式

由题目可以看出来有两种到达i点的情况,结合f[i]的含义,

第一种:f[ i ]  = f[i - 1] +cost[i - 1]

代表到达第i-1层的最小花费再加上到达i的花费就是最终的花费

第二种: f[ i ]  = f[i - 2] +cost[i - 2]

代表到达i - 2层的最小花费再加上i - 2层到i层的花费就是到达i 层的花费

我们取最小值就是到达i层的最小花费了

f[ i ]  = min (f[i ]  = f[i - 1] +cost[i - 1], f[i ]  = f[i - 2] +cost[i - 2])

3.dp数组如何初始化

由递推公式和从第一个元素推得出和题目说可以从下标0或下标为1开始进行,所以f[0] = 0, f[1] = 0;

4.确定遍历顺序

都是从前向后推,所以是从左到右

5.举例推导dp数组

 一般用前面几个元素距离推导dp数组

比如第三个元素是终点,法f[2] = min(f[0] + cost[0],const[1]+cost[1]);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值