力扣算法刷题 Day 41(买卖股票)

121 买卖股票的最佳时机

题目链接

添加链接描述

思路

dp五部曲:

  1. dp数组含义:dp[i][0]表示第i天不持有股票的最多现金,dp[i][1]表示第i天持有股票的最多现金
  2. 递推:dp[i][0] = max(dp[i-1][0],dp[i-1][1] + price[i]);dp[i][1] = max(dp[i-1][1],-price[i]) 注意:只能买卖一次
  3. 初始化:dp[0][0] = 0,dp[0][1] = -price[0]
  4. 遍历方向:从左到右
  5. 模拟:
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size()== 0)
        {
            return 0;
        }
        vector<vector<int>> dp(prices.size(),vector<int>(2));
        dp[0][0] = 0; dp[0][1] = -prices[0];
        for(int i = 1; i < prices.size();i++)
        {
            dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1],-prices[i]); //只能买一次
        }
        return dp[prices.size() - 1][0];

    }
};

122 买卖股票II

题目链接

添加链接描述

思路

与上一道题相比,递推式发生变化:

·dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]
dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // int result = 0;
        // for(int i = 1; i < prices.size();i++)
        // {
        //     result += max(prices[i]-prices[i-1],0);
        // }
        // return result;
        if(prices.size()== 0)
        {
            return 0;
        }
        vector<vector<int>> dp(prices.size(),vector<int>(2));
        dp[0][0] = 0; dp[0][1] = -prices[0];
        for(int i = 1; i < prices.size();i++)
        {
            dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]);
            dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]); //只能买一次
        }
        return dp[prices.size() - 1][0];
    }
};

123 买卖股票III

题目链接

添加链接描述

思路

需要再加一个维度k,表示当前操作位于第一周期还是第二周期。dp五部曲:

  1. dp数组含义:dp[i][0][k]表示第i天不持有股票第k周期(k<2)的最大现金,dp[i][1][k]表示第i天持有股票第k周期(k<2)的最大现金
  2. 递推: dp[i][0][0] = dp[i-1][0][0],dp[i][0][1] = max(dp[i-1][0][1],dp[i-1][1][0] + price[i]),dp[i][1][0] = max(dp[i-1][1][0],-prices[i]),dp[i][1][1] = max(dp[i-1][1][1],dp[i-1][0][1] - prices[i]),dp[i][0][2] = dp[i][1][1] + prices[i]
  3. 初始化:dp[0][0][0] = 0,dp[0][1][0] = -prices[0], dp[0][0][1] = 0, dp[0][1][1] = -prices[0] dp[0][0][2] = 0
  4. 遍历顺序:从左到右
  5. 模拟递推:略
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;

        vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(3, 0)));

        dp[0][0][0] = 0;
        dp[0][1][0] = -prices[0];
        dp[0][0][1] = 0;
        dp[0][1][1] = -prices[0];
        dp[0][0][2] = 0;

        for (int i = 1; i < n; i++) {
            dp[i][0][0] = dp[i - 1][0][0];
            dp[i][1][0] = max(dp[i - 1][1][0], -prices[i]);

            dp[i][0][1] = max(dp[i - 1][0][1], dp[i - 1][1][0] + prices[i]);
            dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][1] - prices[i]);

            dp[i][0][2] = max(dp[i - 1][0][2], dp[i - 1][1][1] + prices[i]);
        }

        return dp[n - 1][0][2];
    }
};
相关推荐
We་ct15 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·leetcode·typescript·动态规划
AI科技星15 小时前
精细结构常数α作为SI 7大基本量纲统一耦合常数的量子几何涌现理论
算法·机器学习·数学建模·数据挖掘·量子计算
txzrxz16 小时前
动态规划——背包问题
算法·动态规划
Yingye Zhu(HPXXZYY)16 小时前
洛谷 P15553 [CCPC 2025 哈尔滨站] 液压机
算法
谭欣辰16 小时前
LCS(最长公共子序列)详解
开发语言·c++·算法
m0_6294947316 小时前
LeetCode 热题 100-----17.缺失的第一个正数
数据结构·算法·leetcode
Cando学算法16 小时前
鸽笼原理(抽屉原理)
c++·算法·学习方法
Tisfy16 小时前
LeetCode 0796.旋转字符串:暴力模拟
算法·leetcode·题解·模拟·字符串匹配
BlockChain88817 小时前
AI+区块链深度探索:算法与账本的共生时代
人工智能·算法·区块链
生成论实验室17 小时前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第一章 源:不可言说的生成之源
人工智能·科技·算法·生活·创业创新