首页 > 编程语言 >代码随想录算法训练营第44天 | 动态规划9:买卖股票总结

代码随想录算法训练营第44天 | 动态规划9:买卖股票总结

时间:2024-07-26 10:50:25浏览次数:9  
标签:代码 买卖 int 44 随想录 prices 冷冻 训练营 dp

188.买卖股票的最佳时机IV
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/
代码随想录
https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课
309.最佳买卖股票时机含冷冻期
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/
代码随想录
https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html#思路
714.买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
代码随想录
https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html#思路

188.买卖股票的最佳时机IV

题解思路

  • 在限制次数的基础上,将状态矩阵的长度也变成变量k。即买卖k次 有\(2*k+1\) 个不同状态。除了第一次以后,奇数为买,偶数为卖
  • dp[i][j]:第[i]个价格时第j个状态。j对应第j//2次买卖,奇数为买,偶数为卖;
  • 初始化:奇数为买;偶数为0(一个股票怎么买卖都不会盈利)
  • 易错:dp[i][0] 第0个状态不能取最大值,否则无法记录交易量的值了。可能有超过k次的交易出现。

题解代码

点击查看代码
class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        if len(prices)<2:
            return 0
        dp = [[0]*(2*k+1) for _ in range(len(prices))]

        for i in range(2*k+1):
            if i%2!=0:
                dp[0][i] = -prices[0]


        for i in range(1,len(prices)):
            ###不用修改dp[0]
            for j in range(1,2*k+1):
                if j%2==0:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+prices[i])
                else:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]-prices[i])
        return dp[-1][-1]

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

题解思路

  • 状态比较复杂:最终总结出有4个状态;
    image
  • 根据状态图 总结出dp推导过程

题解代码

点击查看代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp = [[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][3]-prices[i],dp[i-1][1]-prices[i])
            # 到买的状态有3种情况:
            #     1.冷冻期过后就买(买完一过冷冻期就买) 
            #     2.保持抛出状态后买;
            #     3.维持之前买的状态;
            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])

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

题解思路

  • 只是在买卖的基础上增加了手续费;

题解代码

股票问题总结:

  • 题目分类
    image
  • 分为:
    • 买卖次数一次和多次:只有买卖状态
    • 最多买k次:因为相互有连续,所以有 \(2*k+1\) 个状态
    • 冷冻期:因为有冷冻期,所以有买 卖 卖动作 冷冻期 4个状态
    • 手续费:只在多次的基础上,增加了一个计算
点击查看代码
class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        dp = [[0]*2 for _ in range(len(prices))]
        dp[0][1] = -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] 

标签:代码,买卖,int,44,随想录,prices,冷冻,训练营,dp
From: https://www.cnblogs.com/P201821440041/p/18322595

相关文章

  • CF440D 题解
    题面注意到划分完这棵树以后,每条连通块之间的边的一端一定相同,且是大小为\(k\)的连通块。于是考虑这个连通块的最高点,设\(f(i,j)\)为\(i\)点所在连通块大小为\(j\)时所需的最小边数。令\(f'(i)\)为原来的\(f(i)\)。对于\(i\)的每个\(s\inson(i)\),枚举从\(s\)......
  • 2024牛客暑期多校训练营4
    Preface最赤石的一集,上来先认为D是个煞笔贪心提交了该题的第一发代码并喜提WA后面下机后祁神把L扔给我告诉我就是个煞笔线段树板,结果我写完过不去样例发现题意假了值得一提的是最后发现这两题是这场过的人最少的两题,直接开局给我干的道心破碎之后A题写不来带权并查集样......
  • 代码随想录 day8|| 151 翻转单词 28 字符串匹配 459 重复子串
    151翻转单词funcreverseWords(sstring)string{ //思考:判断单词条件是从0或者空格开始到终或者空格结尾,最简单方式strings.split之后变成切片,然后反转就行了 //考虑双指针,左指针指向单词首位,右指针指向单词末尾 varres[]byte varleft,rightint forright<len......
  • 「代码随想录算法训练营」第二十天 | 回溯算法 part2
    39.组合总和题目链接:https://leetcode.cn/problems/combination-sum/题目难度:中等文章讲解:https://programmercarl.com/0039.组合总和.html视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ题目状态:久违的通过!思路:使用回溯模板,在单层循环时判断当前数组值是否大于......
  • 代码随想录算法训练营第 23 天 |LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetC
    代码随想录算法训练营Day23代码随想录算法训练营第23天|LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串目录代码随想录算法训练营前言LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串一、基础1、回溯可以看成N叉树2、去......
  • 代码随想录算法训练营第 22 天 |LeetCode77. 组合 LeetCode 216.组合总和III LeetCode
    代码随想录算法训练营Day22代码随想录算法训练营第22天|LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合目录代码随想录算法训练营前言LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合一、基础1、回溯可以解......
  • 代码随想录算法训练营第二十二天|回溯算法part01
    第77题.组合在单个集合1-n中,寻找所有个数为k的组合。和所有递归一样,都有三部曲。确定参数与返回值确定终止条件单层逻辑首先,回溯算法的返回值一般是void,参数依照题目要求而增加,在这一题中,参数有n,k还有startIndex。终止条件是path的size等于k,将path存放在result中。......
  • 代码随想录算法训练营第43天 | 动态规划7:买卖股票
    121.买卖股票的最佳时机https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/代码随想录https://programmercarl.com/0121.买卖股票的最佳时机.html#算法公开课and-sell-stock/description/122.买卖股票的最佳时机IIhttps://leetcode.cn/problems/be......
  • 代码随想录算法训练营第42天 | 动态规划7:打家劫舍入门
    打家劫舍https://leetcode.cn/problems/house-robber/description/代码随想录https://programmercarl.com/0198.打家劫舍.html打家劫舍-环形https://leetcode.cn/problems/house-robber-ii/description/代码随想录https://programmercarl.com/0213.打家劫舍II.html#思路......
  • 2844. 生成特殊数字的最少操作 Medium
    给你一个下标从 0 开始的字符串 num ,表示一个非负整数。在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。返回最少需要多少次操作可以使 num 变成特殊数字。如果整数 x 能被 25 整除,则该整数 x ......