首页 > 其他分享 >动态规划--股票总结

动态规划--股票总结

时间:2023-11-21 17:26:04浏览次数:27  
标签:总结 -- 股票 持有 max prices 动态 dp 前一天

目录

题目

  • 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你最多可以完成 K笔 交易。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

分析:

状态:天数i、允许交易的最大次数k、当前持有中状态(0/1)
选择:买入、卖出、无操作

通用模板

def maxProfit(self, prices: List[int]) -> int:
    n = len(prices)
    # 初始化动态规划数组
    dp = [[[0] * 2 for _ in range(3)] for _ in range(n)]
    #base case:
    dp[0][k][0]=0  # 第一天不持有股票,利润为0
    dp[0][k][1]=-prices[0]  # 第一天持有股票,利润为-buy
    #状态转移方程:
    for i in range (1,n):
        for k in range (1,K)
            # 不持有股票的情况,取前一天也不持有股票和前一天持有股票但今天卖出的最大利润
            dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i]) 
            # 持有股票的情况,取前一天也持有股票和前一天不持有股票但今天买入的最大利润,交易次数k减一
            dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i]) 
        return dp[n-1][K][0]
  • 当交易次数k为1(121题)或无穷(122题)时,k对状态转移没有影响,去掉k,从三维数组变成二维数组
def maxProfit(self, prices: List[int]) -> int:
    n = len(prices)
    # 初始化动态规划数组
    dp=[[0] * 2 for _ in range(n)]
    #base case:
    dp[0][0]=0  # 第一天不持有股票,利润为0
    dp[0][1]=-prices[0]  # 第一天持有股票,利润为-buy
    #状态转移方程:
    for i in range (1,n):
        # 不持有股票的情况,取前一天也不持有股票和前一天持有股票但今天卖出的最大利润
        dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) 
        # 持有股票的情况,取前一天也持有股票和前一天不持有股票但今天买入的最大利润,交易次数k减一
        dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]) #当k=1时dp[i-1][0][0]=0带入
    return dp[n-1][0]
  • 309题,k为无穷,含冷冻期,只需要在第i天选择买入的时候,从i-2的状态转移,而不是i-1
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) 
dp[i][1] = max(dp[i-1][1], dp[i-2][0] - prices[i]) 
  • 714题,含手续费,只需要在买入或者卖出的时候减去手续费即可
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]-fee) 
dp[i][1] = max(dp[i-1][1], dp[i-2][0] - prices[i]) 

优化

  • 目前上文提到的四个题,优化思路一致:用两个变量代替二维数组(持有/不持有)
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        #base case
        a=0   # 第一天不持有股票,利润为0
        b=-prices[0]   # 第一天持有股票,利润为-buy
        #动态转移
        for i in range(1,n):  #前面处理了第一天的情况,直接从第二天开始,可以避免下标越界的发生
            a=max(a,b+prices[i])    # 不持有股票的情况,取前一天也不持有股票和前一天持有股票但今天卖出的最大利润
            b=max(b,a-prices[i])    # 持有股票的情况,取前一天也持有股票和前一天不持有股票但今天买入的最大利润
        return a    # 最后一天不持有股票的利润即为最大利润

详细改动请见对应文章

  • 当交易次数k为2(123题)或任意给定值(188题)时
  • 此时k影响状态转移,不能省去,用三维数组。k=2时较小直接把所有情况列举,k为任意值时用for循环
    详情见之前文章

标签:总结,--,股票,持有,max,prices,动态,dp,前一天
From: https://www.cnblogs.com/lushuang55/p/17847037.html

相关文章

  • IdentityServer4:客户端模式
    IdentityServer4:客户端模式  目录IdentityServer4:客户端模式Api资源项目创建项目依赖包添加认证方案添加Api认证服务器创建项目依赖包配置IdentityServer4集成IdentityServer4客户端模式客户端创建项目依赖包Program.csDataService.cs......
  • three demo
    import{OrbitControls}from"three/examples/jsm/controls/OrbitControls";import{CSS2DRenderer,CSS2DObject,}from"three/examples/jsm/renderers/CSS2DRenderer.js";import*asd3from'd3';constscene=newTHREE.S......
  • 【记一次渗透测试无意发现的log4j2】
    【告警发现】在测一个迎新网站的时候发现态势告警dnslog家族请求,看了一下态势感知mmp,我还没测出洞来呢咋服务器自己请求*kmbs6r7ovd.burpcollaborator.net日志了, 根据域名搜了一下日志没有发现,然后看了一下服务器的相关日志,在告警服务器请求bp域名之前是“ApacheLog4j2远程......
  • C# 动态类添加属性
    1.定义JsonDataObject publicsealedclassJsonDataObject:DynamicObject{privatereadonlyDictionary<string,object>_properties;publicJsonDataObject(Dictionary<string,object>properties){_properties=properties;......
  • AGC 020~039 记录
    不想写CF。AGC020D.MinMaxRepetition要令连续的相同字符个数的最大值最小,可以直接贪心将A和B尽可能分开,得出答案\(k=\lfloor\frac{A+B}{\min(A,B)+1}\rfloor\)。接下来要在这个基础上构造字典序最小的答案。我们显然希望A尽量靠前,直到超出限制时再用B分开,即靠前......
  • IdentityServer4:密码模式
    IdentityServer4:密码模式  目录IdentityServer4:密码授权模式Api资源项目创建项目依赖包添加认证方案添加Api认证服务器创建项目依赖包配置IdentityServer4集成IdentityServer4密码模式客户端创建项目依赖包Program.csDataService.cs......
  • 家宽-5- BIOS 更新
     不推荐玩这个,没事做闲的很你可以玩一下. 一:准备好空白U盘,如果有数据请先保存好数据,等下会格式化U盘 二: Rufus官网下载Rufus:https://rufus.ie,也可以蓝奏云直接下载:https://shaun.lanzouq.com/iKKb71bh4b8d 三: 插入空白U盘,找到刚刚下载的rufus,双击打开 ......
  • [Flink] Flink(CDC/SQL)Job在启动时,报“ConnectException: Error reading MySQL varia
    1问题描述1.1基本信息所属环境:CN-PT问题时间:2023-11-21所属程序:FlinkJob(XXXPT_dimDeviceLogEventRi)作业类型:FlinkSQLJob数据流:业务MySQL==>FlinkJob(FlinkCdcConnector(mysql)+FlinkSQL)==>BigdataKafka==>BigdataOLAP==>业务系统作业......
  • IdentityServer4:简化(隐式)模式
    IdentityServer4:简化(隐式)模式  目录IdentityServer4:简化(隐式)模式Api资源项目创建项目依赖包添加认证方案添加Api认证服务器创建项目依赖包配置IdentityServer4集成IdentityServer4添加IdentityServer4的QuickstartUIProgram.cs简化......
  • 2023最新!VMware17安装centos7保姆级教程
    2023最新!VMware17安装centos7保姆级教程安装的是cenos7,使用的是最新的VMware17导航目录2023最新!VMware17安装centos7保姆级教程导航一、虚拟机设置二、虚拟机初次启动配置一、虚拟机设置双击启动程序,在主窗口选择创建新虚拟机选择稍后安装操作系统,点击下一步选择Linux,版......