首页 > 其他分享 >状态机DP学习笔记

状态机DP学习笔记

时间:2024-12-31 18:25:35浏览次数:3  
标签:持有 max price 笔记 状态机 range DP prices dp

参考:买卖股票的最佳时机【基础算法精讲 21】_哔哩哔哩_bilibili

 ps:笔记中的代码按本人理解整理,重思路,非原视频中的代码,也并非最优代码

题目1:买卖股票的最佳时机 II(不限交易次数)

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

  • 思路:第n天结束时的利润 = 第n-1天结束时的利润 + 第n天的利润
  • 状态:持有 & 未持有 
    • 持有 ---> 未持有 (卖):金额增加当日股价 (+ price)
    • 未持有 --> 持有 (买):金额减少当日股(- price)

  • 使用二维DP储存每日金额(持有状态*天数)
  • 代码
    • class Solution:
          def maxProfit(self, prices: List[int]) -> int:
              dp = [[0]*2 for _ in range(len(prices)+1)]
              
              # dp[0]表示未持有, dp[1]表示持有
              dp[0][0] = 0
              dp[0][1] = -float('inf')
              for i in range(1, len(dp)):
                  # price为i-1,因为遍历时i从1开始
                  dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i-1])
                  dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i-1])
              return dp[-1][0]

题目2: 买卖股票的最佳时机(一次交易)

    121. 买卖股票的最佳时机 - 力扣(LeetCode)

  • 变化: 只能有一次交易
  • 状态:持有 & 未持有 (只需要 持有 ➡️ 未持有 的一次转化)
    • 持有(负数):买股票之后的最大值( - price1 的最大值)
    • 未持有:卖了股票之后的最大值(price2 - price1)
  • 代码(变化部分)
    • dp[i][1] = max(dp[i-1][1], -prices[i-1])
      dp[i][0] = max(dp[i-1][0], dp[i][1]+prices[i-1])

题目3: 最佳买卖股票时机含冷冻期(间隔交易)

  • 变化: 卖了之后必须隔 >=1 天才能买
  • 状态:持有 & 未持有 
    • 持有【第n-1天】 ---> 未持有【第n天】(卖):金额增加当日股价 (+ price)
    • 未持有 【第n-2天】 --> 持有 【第n天】(买):金额减少当日股(- price)
  • 代码(变化部分)
    • dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i-1])
      dp[i][1] = max(dp[i-1][1], dp[i-2][0]-prices[i-1])

题目4: 买卖股票的最佳时机 IV(最多 k 次交易)

  • 变化:最多完成 k 次交易【增加一个维表示次数】
  • 状态:持有 & 未持有 
    • 持有 ---> 未持有 (卖):金额增加当日股价 (+ price),并且剩余可交易次数 -1 
    • 未持有 --> 持有 (买):金额减少当日股(- price)
  • 代码
    • class Solution:
          def maxProfit(self, k: int, prices: List[int]) -> int:
              # k+2 是因为要确定边界条件
              dp = [[[-float('inf')]*2 for _ in range(k+2)]for _ in range(len(prices)+1)]
              # 初始状态 k+1 对应的dp[0][k+1][:] 还是用 -float('inf') 界定
              
              for j in range(k+1):
                  dp[0][j][0] = 0
              
              for i in range(1, len(dp)):
                  for j in range(k, -1, -1):
                      # dp[i][k][1] 不会由 dp[i][k+1][0]=-float('inf') 转移而来
                      # 所以第一次交易是从 dp[i][k][1] 转移到 dp[i][k-1][0] 开始的
                      # 如果完成所有k次交易,则实现 dp[i][1][1] 到 dp[i][0][0]
                      dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j+1][1]+prices[i-1])
                      dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j][0]-prices[i-1])
              
              return dp[-1][0][0]

TODO:形变(恰好/至少 k 次)

标签:持有,max,price,笔记,状态机,range,DP,prices,dp
From: https://blog.csdn.net/xying_chloe/article/details/144769013

相关文章

  • html学习笔记
    1.HTML基础HTML标题定义:HTML标题是通过<h1>到<h6>标签定义的,用于创建不同级别的标题。实例:<h1>这是最重要的标题</h1><h2>次重要的标题</h2><h3>一般标题</h3><!--以此类推,直到<h6>-->HTML段落定义:HTML段落是通过<p>标签定义的,用于组织文本内容。实......
  • css学习笔记
    1.CSS基础什么是CSS?定义:CSS(层叠样式表)是一种用于描述HTML或XML文档的表现形式的语言。作用:用于设置字体、颜色、布局等视觉效果,以及动画和过渡等交互效果。CSS的作用域内联样式:直接在HTML元素的style属性中写样式,优先级最高。内部样式:在HTML文档的<style>标签中写样式,作......
  • 8天学习python笔记04
    day04进制和编码目标:了解一些常见名词背后的含义。1.python代码运行方式脚本式python3~/PyCharm软件/学习Python/4.1.py源文件上右键----点击runxx即可运行交互式1、cmd进入命令行,输入python回车,即可进入交互式环境2、输入print("helloworld")回车,即可运行3......
  • 沉淀中,由于翻译校对太花时间,所以更多的还是做个人精简版笔记,THM博客留着慢慢填坑&如需
    对于无法直接发布或者较敏感的文章,将使用密码保护机制。博客主页的背景图片可能需要挂载VPN工具才能成功刷新。⭐需要PDF版THM笔记的可以加一下下面的知识星球,主要包含个人校对的TryHackMe中文笔记PDF版、闲鱼购买的SRC教程、网上白嫖的一些学习资源。......
  • DP协议:PHY层
    引言DisplayPort物理层规定了上游设备(例如DisplayPort源或分支设备的AV输出端口)和下游设备(例如DisplayPort接收器或分支设备的AV输入端口)之间直接连接的物理属性。它将数据传输的电气规范从DisplayPort链路层解耦,从而允许链路层具体设计增强的模块化,并且也允许未来传输媒......
  • 2024秋季学期 复变函数A期末复习笔记
    基础知识级数展开留数定理保形变换拉氏变换......
  • 【论文阅读笔记】SCI算法与代码 | 低照度图像增强 | 2022.4.21
    目录一SCI1SCI网络结构核心代码(model.py)2SCI损失函数核心代码(loss.py)3实验二SCI效果1下载代码2运行一SCI......
  • 【论文阅读笔记】IceNet算法与代码 | 低照度图像增强 | IEEE | 2021.12.25
    目录1导言2相关工作A传统方法B基于CNN的方法C交互方式3算法A交互对比度增强1)Gammaestimation2)颜色恢复3)个性化初始ηB损失函数1)交互式亮度控制损失2)熵损失3)平滑损失4)总损失C 实现细节4实验5IceNet环境配置和运行1下载代码2运行3训......
  • GO 学习笔记之零 (四)字符串处理集锦
    1、遍历字符串中的每个字符 2、去掉字符串前后空格strings.TrimSpace(str)3、字符串长度len(str)4、缓存方式拼接字符串var_bufferbytes.Buffer//定义缓存字符串变量_buffer.WriteString(str1)//拼接字符串_buffer.WriteString(str2[0:1])//拼接字符_buffer......
  • LLaVA-OneVision: Easy Visual Task Transfer论文阅读笔记
    Motivation&AbsLLaVA-OneVision是一种整合数据、模型和视觉表征的开源多模态模型,首次在单图像、多图像和视频三大计算机视觉场景中实现性能突破。其设计支持跨模态/场景的强迁移学习,尤其通过图像任务迁移展现了强大的视频理解和跨场景能力。MethodNetworkArchitectureLLM......