day38 代码回想录 斐波那契数&爬楼梯&使用最小花费爬楼梯

大纲

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

509. 斐波那契数

题目:509. 斐波那契数

// 斐波那契数列
// 动规 5部曲
// 1 dp[i]代表i处的斐波那契值
// 2 递归公式:dp[0] = 0, dp[1]=1, dp[i]=dp[i-1]+dp[i-2]
// 3 dp数组初始化 dp[0]=0,dp[i]=1
// 4 遍历顺序 从前向后
// 5 举例子推导
int fbi(int n) {
    if (n < 2) return n;
    int dp[2] = {0};
    dp[0] = 0;
    dp[1] = 1;
    for (int i = 2; i < n; i++) {
        int tmp = dp[1];
        dp[1] = dp[0] + dp[1];
        dp[0] = tmp;
    }
    return dp[1];
}

70. 爬楼梯

题目:70. 爬楼梯

// 爬楼梯
// 递归5部曲
// dp[i] 代表爬到i的方式总数
// 公式:dp[i]=dp[i-1]+dp[i-2]
// dp数组初始化 dp[0]=1 dp[1]=2
// 遍历顺序从前向后
// 举例子
int stepFloor(int n) {
    if (n < 2) return n;
    int dp[2] = {0};
    dp[0] = 1;
    dp[1] = 2;
    for (int i = 2; i < n; ++i) {
        int tmp = dp[1];
        dp[1] = dp[0] + dp[1];
        dp[0] = tmp;
    }
    return dp[1];
}

746. 使用最小花费爬楼梯

题目:746. 使用最小花费爬楼梯

// 爬楼梯的最少次数
// 给定一个数组,求抵达末尾的最少代价,其中i处代表到i的代价
// 动态规划
// 1 dp[i] 代表到达i处的最少代价
// 2 公式 dp[i] = min(dp[i-1]+nums[i-1], dp[i-2]+nums[i-2])
// 3 初始化 dp[0] = 0 dp[1]=0
// 4 遍历顺序 前-》后
// 5 [10,15,20]
int minStepSpend(vector& nums) {
    if (nums.size() < 2) return 0;

    int dp0 = 0, dp1 = 0;
    for (int i = 2; i < nums.size(); ++i) {
        int tmp = dp1;
        dp1 = min(dp0 + nums[i-2], dp1 + nums[i-1]);
        dp0 = tmp;
    }
    return dp1;
}

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