【代码随想录】33

12

2023年10月16日 - 动态规划1

509. 斐波那契数

动态规划五部曲

  • 明确递推数组及下标含义

  • 递推公式

  • 递推数组初始化

  • 遍历顺序

  • 打印数组看对不对

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

也可以维护两个数值

 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. 爬楼梯

 // 版本一
 class Solution {
 public:
     int climbStairs(int n) {
         if (n <= 1) return n; // 因为下面直接对dp[2]操作了,防止空指针
         vector<int> dp(n + 1);
         dp[1] = 1;
         dp[2] = 2;
         for (int i = 3; i <= n; i++) { // 注意i是从3开始的
             dp[i] = dp[i - 1] + dp[i - 2];
         }
         return dp[n];
     }
 };

746. 使用最小花费爬楼梯

 class Solution {
 public:
     int minCostClimbingStairs(vector<int>& cost) {
         vector<int> dp(cost.size() + 1);
         dp[0] = 0; // 默认第一步都是不花费体力的
         dp[1] = 0;
         for (int i = 2; i <= cost.size(); i++) {
             dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
         }
         return dp[cost.size()];
     }
 };
 ​