算法练习第三十三天 509|70|746

509 斐波那契数

思路:

如果 n 小于等于 1,则直接返回 n,因为斐波那契数列的前两项分别为 0 和 1
定义一个长度为 2 的数组 dp,用于存储斐波那契数列的前两项
初始化 dp[0] 为 0,dp[1] 为 1
使用循环计算 dp 数组中的每一项,从 2 开始到 n
计算 dp 数组中前两项的和,存储在变量 sum 中
更新 dp 数组中的值,dp[0] 被赋值为原来的 dp[1],dp[1] 被赋值为 sum
循环结束后,返回 dp[1],即斐波那契数列的第 n 项。

1.动态规划

class Solution {
public:
    int fib(int n) {
        if(n <= 1) return n;
        int dp[2];
        dp[0] = 0;
        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 - 1] + dp[i - 2]

1.动态规划

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

746 使用最小花费爬楼梯

思路:

定义一个长度为 2 的数组 dp,用于存储到达当前台阶的最小代价
初始化 dp[0] 和 dp[1] 的值都为 0,表示到达前两个台阶的最小代价都为 0
使用循环计算到达每个台阶的最小代价,从第三个台阶开始到达最后一个台阶
计算到达当前台阶的最小代价,根据动态规划的状态转移方程 dpi = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]),其中 i 表示当前台阶的编号,dpi 表示到达当前台阶的最小代价
更新 dp 数组中的值,dp[0] 被赋值为原来的 dp[1],dp[1] 被赋值为 dpi
循环结束后,返回 dp[1],即到达最后一个台阶的最小代价。

1.动态规划

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int dp[2];
        dp[0] = 0;
        dp[1] = 0;
        for(int i = 2; i <= cost.size(); i++){
            int dpi = min(dp[1] + cost[i - 1], dp[0] + cost[i - 2]);
            dp[0] = dp[1];
            dp[1] = dpi;
        }
        return dp[1];
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容