力扣算法刷题 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. 初始化:dp000 = 0,dp010 = -prices0, dp001 = 0, dp011 = -prices0 dp002 = 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];
    }
};
相关推荐
Niuguangshuo27 分钟前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
找方案38 分钟前
AI+人力资源:AI招聘面试的兴起与争议
人工智能·面试·职场和发展
讳疾忌医丶1 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真1 小时前
今天是学习嵌入式的第37天
linux·学习·算法
罗西的思考3 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技4 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字3225 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
测试老哥6 小时前
接口测试的测试用例应该怎么写?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
huang5791476 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_7 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法