代码随想录算法训练营第38天 | 动态规划理论基础 LeetCode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

@代码随想录算法训练营第38天 | 动态规划 LeetCode509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

509. 斐波那契数

第一遍读题思考

确定dp[i]的含义,确定递推公式,如何初始化,确定遍历顺序。

代码随想录解法思路

c++代码具体实现注意事项

class Solution {
public:
    int fib(int n) {
        if(n<=1) return n;
        int dp[2];
        dp[0] = 1;
        dp[1] = 1;
        for(int i=2;i<n;i++){
            int sum = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = sum;
        }
        return dp[1];
    }
};

70. 爬楼梯

第一遍读题思考

确定dp[i]的含义,确定递推公式,如何初始化,确定遍历顺序。

代码随想录解法思路

dp[i]就用来表示爬上第i层台阶有几种方法,那么很显然,递推公式就是dp[i]=dp[i-1]+dp[i-2]。

c++代码具体实现注意事项

class Solution {
public:
    int climbStairs(int n) {
        int dp[3];
        dp[0] = 1;
        dp[1] = 1;
        if(n<=1) return 1;
        for(int i=2;i<=n;i++){
            dp[2] = dp[0]+dp[1];
            dp[0] = dp[1];
            dp[1] = dp[2];
        }
        return dp[2];
    }
};

746. 使用最小花费爬楼梯

第一遍读题思考

确定dp[i]的含义,确定递推公式,如何初始化,确定遍历顺序。

代码随想录解法思路

dp[i]就用来表示爬上第i层台阶所耗费的体力,初始化dp[0]和dp[1]等于0,因为爬上0和1台阶不需要消费体力。
那么爬上dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])。

c++代码具体实现注意事项

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

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