当前位置: 首页 > article >正文

代码随想录训练营第49天|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

121.买卖股票的最佳时机

显然这道题可以用普通的方法做,可能会更容易想,也更容易做,但是由于在学习动态规划,因此此文只给动态规划的解法。
对于每一天的状况,我们给予它两种状态,持有股票以及没有持股票,用一个数组dp[ii][0]表示第ii天没有持股票,dp[ii][1]表示第ii天持有股票。而其如何进行动态处理呢?
对于第ii天,如果持有股票,那么如果想要收益最高,那么股票的价格应该更低,因此,如果今天的股票价格比之前记录的更低,那么我们让它进行更新,也就是让dp[ii][1] = max(-prices[ii],dp[ii][1]);没有持股票的话,就是今天将股票卖出去的钱,和昨天可以赚的最多金额进行比较,如果今天的钱更多,我们就进行更新。dp[ii][0] = max(dp[ii-1][1]+prices[ii],dp[ii-1][0]);
动态四部曲
1.dp二维数组的含义,dp[ii][0]表示第ii天没有持股票的最大金额,dp[ii][1]表示第ii天持有股票的最大金额。
2.dp二维数组的推导过程,
dp[ii][1] 取昨天金额和今天卖出股票的金额最大值,dp[ii][1] = max(-prices[ii],dp[ii][1]);
dp[ii][0]取昨天记录的股票价格和今天股票价格的更小值,dp[ii][0] = max(dp[ii-1][1]+prices[ii],dp[ii-1][0]);
3.dp二维数组的初始化,令dp[0][0]为0,dp[0][1] 为第一天股票的负值。
4.从前向后进行遍历。

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>>dp(prices.size(),vector<int>(2,0));//0不持有股票,1持有股票
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int ii =1;ii<prices.size();ii++)
            {
                dp[ii][0] = max(dp[ii-1][1]+prices[ii],dp[ii-1][0]);
                dp[ii][1] = max(dp[ii-1][1],-prices[ii]);
            }
        return dp[prices.size()-1][0];
    }
};

122.买卖股票的最佳时机Ⅱ

与上一题相似,这道题也是买卖股票,区别在于本道题的股票可以多次买卖,因此,需要记录第ii天的最大现金。因此,dp[ii][0]dp[ii][1]数组的含义为未持有与持有股票的最大现金。
推导公式为:第ii天没有持有股票的话,为前一天没有持股票的最大现金与今天卖掉股票的最大现金取较大者。dp[ii][0] = max(dp[ii-1][0],prices[ii]+dp[ii-1][1]);
第ii天持有股票的话,就是前一天没有持股票减去今天的股票价格与前一天的股票价格取较大者。dp[ii][1] = max(dp[ii-1][1],dp[ii-1][0]-prices[ii]);

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {//0没有买股票的最大现金,1买了股票的最大现金
        vector<vector<int>>dp(prices.size(),vector<int>(2,0));
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int ii = 1;ii<prices.size();ii++)
        {
            dp[ii][0] = max(dp[ii-1][0],prices[ii]+dp[ii-1][1]);
            dp[ii][1] = max(dp[ii-1][1],dp[ii-1][0]-prices[ii]);
        }
        return dp[prices.size()-1][0];
    }
};

http://www.kler.cn/a/6769.html

相关文章:

  • 完整http服务器
  • C 语言标准库 - <stdlib.h>
  • opencascade源码学习之HLRAlgo包 -HLRAlgo_Projector
  • Java策略模式应用实战
  • Linux网络:HTTPS协议
  • go-zero(二) api语法和goctl应用
  • ES 聚合查询(四)-cnblog
  • Linux0.11 内核体系结构(八)
  • 【AUTOSAR】【Lin通信】LinTrcv
  • Linux基础操作 常用命令 Centos
  • 【VUE】vue打包后引入js和css用相对路径引入
  • C++编程大师之路:从入门到精通-通讯录管理系统
  • SpringBoot——SB整合mybatis案例(残缺版本)第四集(真*大结局)
  • Edge集锦没有同步按钮 - 待解决
  • JVM内存区域面试详解
  • tftp与ftp的异同
  • 队列(Queue)与双端队列 (Deque)
  • pdf压缩文件怎么压缩最小?办公常备软件
  • 一份详细 redis sentinel 哨兵架构搭建步骤<写于2023-04-06>
  • 考研数二第十二讲 复合函数、反函数、隐函数及参数方程所确定的函数的微分法与一阶微分形式的不变性
  • WT588D-32L 应用电路
  • VTK-vtkPolygon
  • 2000-2020年地级市进出口总额数据
  • 作为大学生,你还不会搭建chatGPT微应用吗?
  • 回溯算法的五类问题:组合、排列、子集、分割、棋盘
  • Java高频必背面试题基础篇02