力扣算法刷题 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];
    }
};
相关推荐
幻风_huanfeng3 小时前
人工智能之数学基础:内点法和外点法的区别和缺点
人工智能·算法·机器学习·内点法·外点法
MIngYaaa5203 小时前
The 6th Liaoning Provincial Collegiate Programming Contest - External 复盘
算法
CylMK3 小时前
题解:P11625 [迷宫寻路 Round 3] 迷宫寻路大赛
c++·数学·算法
计算机安禾3 小时前
【数据结构与算法】第44篇:堆(Heap)的实现
c语言·开发语言·数据结构·c++·算法·排序算法·图论
kaikaile19953 小时前
能量算子的MATLAB实现与详细算法
人工智能·算法·matlab
tankeven4 小时前
HJ175 小红的整数配对
c++·算法
结构化知识课堂4 小时前
产品经理面试:产品需求分析10题(政策解读、用户心理研究)含答案
面试·职场和发展·产品经理·需求分析·产品思维
Aaron15884 小时前
数字波束合成DBF与模拟波束合成ABF对比浅析
大数据·人工智能·算法·硬件架构·硬件工程·信息与通信·信号处理
成都易yisdong4 小时前
实现三北方向转换计算器(集成 WMM2025 地磁模型)
开发语言·windows·算法·c#·visual studio