【动态规划算法练习】day1

文章目录

  • 一、第 N 个泰波那契数
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 二、面试题 08.01. 三步问题
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 三、746. 使用最小花费爬楼梯
    • 1.题目简介
    • 2.解题思路
    • 3.代码
    • 4.运行结果
  • 总结


一、第 N 个泰波那契数

1.题目简介

1137. 第 N 个泰波那契数
【动态规划算法练习】day1_第1张图片

2.解题思路

【动态规划算法练习】day1_第2张图片

3.代码

  1. 正常dp:
class Solution {
public:
    int tribonacci(int n) {
        vector<int> dp(n + 1);
        if(n == 0 | n == 1) return n;
        if(n == 2) return 1;
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 1;
        for(int i = 3;i < n + 1; ++i)
        {
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
        }
        return dp[n];
    }
};
  1. 空间优化后:
//空间优化:滚动数组
class Solution {
public:
    int tribonacci(int n) {
        if(n == 0 | n == 1) return n;
        if(n == 2) return 1;
        int n0 = 0, n1 = 1, n2 = 1, n3 = 0;
        for(int i = 3;i < n + 1; ++i)
        {
            n3 = n0 + n1 + n2;
            n0 = n1;
            n1 = n2;
            n2 = n3; 
        }
        return n3;
    }
};

4.运行结果

【动态规划算法练习】day1_第3张图片

二、面试题 08.01. 三步问题

1.题目简介

面试题 08.01. 三步问题
【动态规划算法练习】day1_第4张图片

2.解题思路

【动态规划算法练习】day1_第5张图片

3.代码

  1. 普通dp
class Solution {
public:
    int waysToStep(int n) {
        if(n == 1 | n == 2) return n;
        if(n == 3) return 4;
        vector<long long> dp(n + 1);
        dp[1] = 1, dp[2] = 2, dp[3] = 4;
        for(int i = 4;i < n + 1; ++i)
        {
            dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % 1000000007;
        }
        return dp[n];
    }
};
  1. 空间优化后:
class Solution {
public:
    int waysToStep(int n) {
        if(n == 1 | n == 2) return n;
        if(n == 3) return 4;
        long long a = 1, b = 2, c = 4, d = 0;
        for(int i = 4;i < n + 1; ++i)
        {
            d = (a + b + c) % 1000000007;
            a = b, b = c, c = d;
        }
        return d;
    }
};

4.运行结果

【动态规划算法练习】day1_第6张图片

三、746. 使用最小花费爬楼梯

1.题目简介

746. 使用最小花费爬楼梯
【动态规划算法练习】day1_第7张图片

2.解题思路

【动态规划算法练习】day1_第8张图片

3.代码

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

4.运行结果

【动态规划算法练习】day1_第9张图片


总结

今天是算法练习的第一天,写了三个入门级别的动态规划题目,良好的开端是成功的一半,之后的每一天我都会更新算法练习。
如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

你可能感兴趣的:(动态规划-算法练习,算法,动态规划,leetcode,c++)