代码随想录打卡第38天

动态规划做题思路。

关键点:

1.dp[i][j]理解dp数据和i和j的含义

2.递归公式

3.dp初始化

4.遍历顺序

5.打印dp数组

509. 斐波那契数

https://leetcode.cn/problems/fibonacci-number/

dp数组含义:

dp[i] 表示第一个斐波拉契数是什么

递推公式:

dp[i] = dp[i-1] + dp[i-2]

初始化:

dp[0]=0;

dp[1] = 1

class Solution {

public:

    int fib(int n) {

        vector<int> dp(n+1,0);

        dp[0] = 0;

        if(n == 0)

            return dp[0];

        dp[1] = 1;

        if(n == 1)

            return dp[1];

        for(int i=2;i<=n;i++)

            dp[i] = dp[i-1] + dp[i-2];

        return dp[n];

    }

};


70. 爬楼梯

https://leetcode.cn/problems/climbing-stairs/

dp数组含义:

dp[i]表示爬到第i阶有多少种方法

递推公式:

dp[n] = dp[n-1] + dp[n-2]

表示最后一步如果是1级有dp[n-1]种方法

如果是2级,有dp[n-2]种方法。

class Solution {

public:

    int climbStairs(int n) {

        vector<int> dp(n+1, 0);

        dp[0] = 0;

        if(n==0)

            return 0;

        dp[1] = 1;

        if(n==1)

            return 1;

        dp[2] = 2;

        if(n==2)

            return 2;

        for(int i = 3;i<=n;i++)

        {

            dp[i] = dp[i-1] + dp[i-2];

        }

        return dp[n];

    }

};


746. 使用最小花费爬楼梯

https://leetcode.cn/problems/min-cost-climbing-stairs/

算法思想:

dp[i]表示爬到i个楼梯的最小花费

递推公式:

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

class Solution {

public:

    int minCostClimbingStairs(vector<int>& cost) {

        int n = cost.size();

        vector<int> dp(n+1, 0);

        dp[0]=0;

        if(n==0)

            return 0;

        dp[1] = 0;

        if(n==1)

            return 0;

        for(int i=2;i<=n;i++)

        {

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

        }

        return dp[n];

    }

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容