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

宁波专业做网站公司培训机构管理系统

宁波专业做网站公司,培训机构管理系统,bing搜索引擎国际版,建设银行网站怎么修改手机号码文章目录 309. 最佳买卖股票时机含冷冻期标准 dp机智的分析解法 714. 买卖股票的最佳时机含手续费贪心算法 股票总结 309. 最佳买卖股票时机含冷冻期 题目链接 | 解题思路 标准 dp 本题多了冷却期的条件,将原本的两个状态变得更复杂了。变化在于,如果…

文章目录

  • 309. 最佳买卖股票时机含冷冻期
    • 标准 dp
    • 机智的分析解法
  • 714. 买卖股票的最佳时机含手续费
    • 贪心算法
  • 股票总结

309. 最佳买卖股票时机含冷冻期

题目链接 | 解题思路

标准 dp

本题多了冷却期的条件,将原本的两个状态变得更复杂了。变化在于,如果考虑第 i 天的状态是“持有股票”,那么不能简单地推导为“第 i-1 天持有股票”和“第 i-1 天未持有股票,第 i 天买入股票”,因为可能第 i 天是冷却期。所以,需要特殊讨论针对冷却期的递推公式。

可以看到和之前的一个最大的区别在于,本题需要详细地分类讨论“不持有股票的状态”。每一天的情况可能是“持有股票”,“未持有股票 + 不在冷却期”,“未持有股票 + 在冷却期”,“未持有股票 + 刚卖出股票”。分类讨论的情况更多了,需要更清晰的递推公式。另外,本题还单独列出了“今天刚卖出股票”这个具体的动作状态,是因为“刚卖出股票” -> “冷却期”这个递推是确定的。

  1. dp 数组的下标含义:
    • dp[i][0]:第 i 天结束时持有股票
    • dp[i][1]:第 i 天结束时不持有股票 + 不在冷却期内
    • dp[i][2]:第 i 天结束时不持有股票 + 当天卖出股票
    • dp[i][3]:第 i 天结束时不持有股票 + 当天为冷却期
  2. dp 递推公式:
    • dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i], dp[i-1][3] - prices[i]),如果第 i 天持有股票,那么
      • i-1 天就持有股票,dp[i][0] = dp[i-1][0]
      • i-1 天不持有股票,那又分为两种情况
        • i-1 天是冷却期,第 i 天可以正常交易,dp[i][0] = dp[i-1][3]
        • i-1 天不在冷却期内,第 i 天可以正常交易,dp[i][0] = dp[i-1][1]
    • dp[i][1] = max(dp[i-1][1], dp[i-1][3]),如果第 i 天不是冷却期,那么
      • i-1 天就不在冷却期,dp[i][1] = dp[i-1][1]
      • i-1 天就是冷却期,dp[i][1] = dp[i-1][3]
    • dp[i][2] = dp[i-1][0] + prices[i],如果第 i 天要卖出股票,那么第 i-1 天必然是持有股票的
    • dp[i][3] = dp[i-1][2],如果第 i 天是冷却期,那么第 i-1 天必然是卖出股票的
  3. dp 数组的初始化:初始化自然是考虑第一天,本题的初始化还是有些难判断的
    • dp[0][0] = -prices[0]:显然,第一天结束时持有股票,那只能是第一天购买了股票
    • dp[0][1] = 0:显然,第一天结束时没有持有股票,只能是第一天没有任何操作
    • dp[0][2] = 0:符合定义的话,只能是第一天就买入再卖出股票,收益为 0
    • dp[0][3] = 0:根据定义,这个状态是非法的,因为很明显不可能在第一天就进入冷却期(没有办法在前一天卖出股票)。然而定义上非法的初始化,也要为了后续的递推服务,所以可以根据递推公式来得到初始化的值:
      • 在第二天的状态中,只有 dp[1][1] = max(dp[0][1], dp[0][3]) 会用到 dp[0][3]。从含义上,第二天如果不持有股票并且不在冷却期,那么第一天就肯定没有买入股票,dp[1][1] 应该是 0(dp[0][1])。那么为了得到正确的 dp[1][1],我们应该初始化 dp[0][3] = 0
  4. dp 的遍历顺序:从前向后即可。
  5. 举例推导:
12302
0-1-1-111
100012
2012-13
30012-1
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) == 1:return 0dp = [[0] * 4 for _ in range(len(prices))]dp[0][0] = -prices[0]for i in range(1, len(prices)):dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i], dp[i-1][3] - prices[i])dp[i][1] = max(dp[i-1][1], dp[i-1][3])dp[i][2] = dp[i-1][0] + prices[i]dp[i][3] = dp[i-1][2]return max(dp[-1][1], dp[-1][2], dp[-1][3])

和之前一样,也可以优化成 O ( 1 ) O(1) O(1) 的空间复杂度。

机智的分析解法

本题和122. 买卖股票的最佳时机II的区别只在于多了一个冷却期。如上的状态分析是解决题目的标准流程。但是延续之前题目的做法,同样也能解决这道题。注意到,不持有股票的状态不会受到任何影响,只有想要买入股票的时候需要考虑冷却期的存在。

关键在于:“如果第 i 天持有股票,那么当前的收益究竟怎么进行推导”

  • 如果第 i - 1 天就持有股票,那么就直接复制前一天的状态,dp[i][1] = dp[i-1][1]
  • 如果第 i - 1 天未持有股票,那么分两种情况:
    • i - 1 天是冷却期,那么就是在第 i - 2 天卖出了股票,dp[i][1] = dp[i-2][0] - prices[i]
    • i - 1 天不是冷却期,那么应该得到 dp[i][1] = dp[i-1][0] - prices[i]

如果根据以上的状态分析,无法得到一个 closed-form 的递推公式,因为我们不知道第 i-1 天是否是冷却期,也就不知道何时该使用 dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]),何时该使用 dp[i][1] = max(dp[i-1][1], dp[i-2][0] - prices[i])
但是,如果第 i-1 天不是冷却期且不持有股票,那么第 i-1 天只有两种情况:

  • 之前从来没有交易过股票
  • i - 2 天或之前是冷却期

无论是哪种情况,我们都能得到 dp[i-1][0] = dp[i-2][0]。所以虽然第 i-1 天的状态是否是冷却期不得而知,但是第 i 天持有股票的递推公式可以确定是 dp[i][1] = max(dp[i-1][1], dp[i-2][0] - prices[i])

这样,我们只需要最小限度地修改122. 买卖股票的最佳时机II的代码,就能解题。

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) == 1:return 0# dp[i][0] represents the max profit on day i without the stock# dp[i][1] represents the max profit on day i with the stockdp = [[0, 0] for _ in range(len(prices))]dp[0] = [0, -prices[0]]dp[1] = [max(0, prices[1] - prices[0]), max(-prices[0], -prices[1])]for i in range(2, len(prices)):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])return dp[-1][0]

714. 买卖股票的最佳时机含手续费

题目链接 | 解题思路

本题的 dp 解法和122. 买卖股票的最佳时机II唯一的区别是多了一个手续费,所以从“持有股票”到“未持有股票”的利润递推需要多减去手续费,其他全部保持不变。

class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:# dp[i][0] represents the max profit on day i without the stock# dp[i][1] represents the max profit on day i with the stockdp = [[0, 0] for _ in range(len(prices))]dp[0] = [0, -prices[0]]for i in range(1, len(prices)):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-1][0] - prices[i])return dp[-1][0]

贪心算法

贪心解法
本题也可以用贪心算法来解决,也算是照应了122. 买卖股票的最佳时机II。但是本题的贪心解法不像之前一样简单,在计算的时候对所需要的区间要求更高,情况也更复杂。

如果简单计算所有增区间,那么就会遇到有的区间利润不足以抵手续费的情况,同时多次买卖也会导致更多的手续费,从而使利润降低。所以我们想找到的区间,应该是:

  • 买入利润:遇到更低的价格就更新记录;
  • 卖出利润:按理来说是当前增最大区间的最后一天的利润。但是没必要具体知道哪一天进行了卖出,只要当能够盈利的时候进行一次模拟的卖出即可,同样能够得到正确的利润(但是需要一些小技巧)。

如下,在第一次发现当前的交易能够制造利润时(prices[i] > min_price + fee),我们会选择直接进行当前交易,并且扣除一次手续费,随后减少 min_price。之后会有两种情况:假设 fee = 2,

  • prices = [1, 4, 0, 5]
    • 第二天,发现有真正的盈利,profit = 1, min_price = 2
    • 第三天,发现了更低的价格,min_price = 0,将会开始新的交易,同时结束了上一次的交易(记录区间)
  • prices = [1, 5, 8]
    • 第二天,发现有真正的盈利,profit = 2, min_price = 3
    • 第三天,发现有真正的盈利,此时新的盈利为5,而不是预计的3,因为 min_price 在这次计算前发生了变化,相当于抵消了该次交易的手续费

所以模拟的卖出实际上是在第一次发现真正的盈利后,就记录一次交易的手续费,并且改变当前的 min_price,从而免除当前区间的后续交易(如果存在)的手续费。着实非常巧妙!

class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:min_price = prices[0]profit = 0for i in range(1, len(prices)):if prices[i] < min_price:min_price = prices[i]if prices[i] <= prices[i] <= min_price + fee:continueif prices[i] > min_price + fee:profit += (prices[i] - min_price) - feemin_price = prices[i] - feereturn profit

股票总结

股票问题总结

股票问题是第一次在 dp 中需要记录状态的题型。之前的 dp 题,无论是打家劫舍还是背包问题,都是考验对子问题最优解的利用,即正确的递推公式+遍历顺序。股票问题则需要对子问题进行分类讨论,记录各个状态下的子问题最优解,这一点是非常新颖的。同时,不知道是不是巧合,大部分股票问题都可以用贪心来解决,虽然实现贪心的难度不小。

最标准的股票问题应该是122. 买卖股票的最佳时机II,需要真正地记录并利用状态。

随后,复杂的限制交易次数的股票问题188.买卖股票的最佳时机IV把 dp 变得更复杂了,相比于之前的标准题,有了类似爬楼梯式的进阶。

而堪称神题的是309.最佳买卖股票时机含冷冻期。标准解法中,活用了状态分类的思想,将原本的“未持有股票”进一步细分,来适应新条件下的递推公式。而机智的分析算法中,通过分析最小限度地修改了之前的代码,解决了问题。两种解法都非常重要,代表了股票问题的精华。


文章转载自:
http://feracious.zfyr.cn
http://breaking.zfyr.cn
http://mitsvah.zfyr.cn
http://lucubration.zfyr.cn
http://matripotestal.zfyr.cn
http://unhurt.zfyr.cn
http://bunkmate.zfyr.cn
http://eudora.zfyr.cn
http://recloser.zfyr.cn
http://strappy.zfyr.cn
http://unprojected.zfyr.cn
http://safen.zfyr.cn
http://sempre.zfyr.cn
http://skeeler.zfyr.cn
http://mesozoa.zfyr.cn
http://ballonet.zfyr.cn
http://kerfuffle.zfyr.cn
http://costly.zfyr.cn
http://siphunculated.zfyr.cn
http://homopterous.zfyr.cn
http://achlorhydria.zfyr.cn
http://wellaway.zfyr.cn
http://latine.zfyr.cn
http://johannine.zfyr.cn
http://hotshot.zfyr.cn
http://autoantibody.zfyr.cn
http://wattmeter.zfyr.cn
http://quadriennium.zfyr.cn
http://erse.zfyr.cn
http://certified.zfyr.cn
http://quercitrin.zfyr.cn
http://maltman.zfyr.cn
http://neuroscience.zfyr.cn
http://palk.zfyr.cn
http://marquetry.zfyr.cn
http://uneducated.zfyr.cn
http://somnambulic.zfyr.cn
http://salinification.zfyr.cn
http://haikwan.zfyr.cn
http://ecology.zfyr.cn
http://parajournalism.zfyr.cn
http://anchoret.zfyr.cn
http://bortz.zfyr.cn
http://mazhabi.zfyr.cn
http://polyglottal.zfyr.cn
http://habited.zfyr.cn
http://maneating.zfyr.cn
http://syli.zfyr.cn
http://trifolium.zfyr.cn
http://jibaro.zfyr.cn
http://encrinite.zfyr.cn
http://retiring.zfyr.cn
http://slumlord.zfyr.cn
http://tradesman.zfyr.cn
http://phenom.zfyr.cn
http://monstera.zfyr.cn
http://atremble.zfyr.cn
http://silicidize.zfyr.cn
http://ancipital.zfyr.cn
http://dossy.zfyr.cn
http://tawney.zfyr.cn
http://announcement.zfyr.cn
http://deplorably.zfyr.cn
http://literator.zfyr.cn
http://hawker.zfyr.cn
http://narcotic.zfyr.cn
http://deloul.zfyr.cn
http://narcodiagnosis.zfyr.cn
http://satellite.zfyr.cn
http://winded.zfyr.cn
http://increately.zfyr.cn
http://hardicanute.zfyr.cn
http://pickel.zfyr.cn
http://hodographic.zfyr.cn
http://chooser.zfyr.cn
http://tonneau.zfyr.cn
http://frise.zfyr.cn
http://crinkleroot.zfyr.cn
http://pyrometer.zfyr.cn
http://modernise.zfyr.cn
http://lapse.zfyr.cn
http://fargo.zfyr.cn
http://oviform.zfyr.cn
http://gingkgo.zfyr.cn
http://potentially.zfyr.cn
http://host.zfyr.cn
http://rhema.zfyr.cn
http://shoplifter.zfyr.cn
http://copyright.zfyr.cn
http://pachisi.zfyr.cn
http://approbation.zfyr.cn
http://protoxylem.zfyr.cn
http://unfoiled.zfyr.cn
http://idyl.zfyr.cn
http://worth.zfyr.cn
http://collarwork.zfyr.cn
http://pisolite.zfyr.cn
http://nephron.zfyr.cn
http://limen.zfyr.cn
http://spendthrifty.zfyr.cn
http://www.dt0577.cn/news/73021.html

相关文章:

  • 哈尔滨模板自助建站品牌营销策划公司
  • 不懂代码怎么做网站网络推广的话术怎么说
  • 帮人做网站的公司百度seo查询收录查询
  • 当当网网站内容建设的分析品牌的宣传及推广
  • 免费的海报设计网站百度查询最火的关键词
  • 陕西网站建设技术方案广告设计与制作需要学什么
  • 新网站建设流程百度人工投诉电话是多少
  • 做家居网站做网站好的网站建设公司
  • 广东网站备案系统关键词搜索热度
  • 鞋帽箱包网站建设百度seo自然优化
  • 龙岩做网站冯耀宗seo博客
  • 大连哪家科技公司做网站好淘宝推广平台有哪些
  • 宿州建设公司网站seo排名优化推荐
  • 阿里云空间做网站快速网站seo效果
  • 做业务有哪些好的网站域名批量查询
  • 做门用什么网站好搜狗网页版入口
  • 小程序微信公众平台石家庄关键词优化报价
  • 上海市工商局官网哈尔滨优化网站公司
  • wordpress nginx phpseo网站排名优化服务
  • 潍坊网站建设联系电话windows11优化大师
  • 北京做网站建设有发展吗太原百度公司地址
  • 服务器怎么直接用ip做网站山东百度推广
  • 记事本做网站背景色怎么弄seo搜索引擎优化方式
  • 应该知道的网站手机上如何制作自己的网站
  • dede企业网站带留言板后台查询seo技术306
  • 怎么建设企业网站技术培训学校机构
  • javst WordPress 主题沈阳网站关键字优化
  • 夏天做那个网站致富营销型外贸网站建设
  • 网站建设 业务员小程序推广的十种方式
  • 甘肃省住房和城乡建设部网站个人主页网页设计模板