力扣算法刷题 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];
    }
};
相关推荐
benben0446 分钟前
强化学习之DQN算法族(基于gymnasium开发)
算法
何以解忧,唯有..1 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
想吃火锅10052 小时前
【leetcode】88.合并两个有序数组js
算法
生成论实验室3 小时前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构
Qres8213 小时前
算法复键——树状数组
数据结构·算法
H178535090963 小时前
SolidWorks第四部分_直接实体建模特征9_替换面原理
线性代数·算法·机器学习·3d建模·solidworks
dayuOK63073 小时前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
不会就选b3 小时前
算法日常・每日刷题--<二分查找>3
算法
枫子有风4 小时前
LLM-Agent智能体(大厂面试常问)
面试·职场和发展·llm·agent