动态规划[买卖股票的最佳时机一系列]

发布时间 2023-09-09 11:23:55作者: timeMachine331

目的是最大化一个利润的值,前提:买必涨,只是考虑赚多少。

之前的cost是今天的price

收益一次 = 卖的价格减去买的价格 = price - cost 。if profit < 0 then 0,无滞后性,每次卖股票都是站在当前这天的角度,但是可以看到后面几天股票的价格,所以如果不见涨,则不会买。

总收益 = 很多次收益的累加和。这个次数限制可能是无数次(退化为贪心)。一次、两次、k次

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/solutions/2199035/yi-tao-mo-ban-ji-xing-dai-ma-bi-zhao-yan-0ap8/

 

121. 买卖股票的最佳时机

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

如果说dp[i]表示某一天,那么对于每个i,都应该会记录那天快结束时候的收益情况。

收益是累加了之前天的已经卖出的股票获得的收益,至于当前手上有没有股票,就得分情况

dp[i][0],第i天结束时的最大收益,但是这天手上还有股票了(不是光光是今天买没买股票)

dp[i][1],第i天结束时的最大收益,但是这天手上没股票了(不是光光是今天卖没卖股票)

第一种情况,手上还有股票,可能是今天买的,可能是之前买的但是今天没卖,那再分两种,取最大。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        dp = [[0, 0] for _ in range(n)]
        dp[0] = [-prices[0], 0]
        for i in range(1, n):
        //没有免费的午餐 只要是手上还有股票的情况,总有一天其中一天的profit是负的,得花钱买。但是没花钱买的时候,那就跟前一天一样,表示当天结束时没买也没卖的情况 dp[i][
0] = max(dp[i-1][0], - prices[i])
        //dp[i-1][0]之前某一天低价买入花的钱。但是同时只能持有一只,所以如果是发生交易的情况,则必是卖了某个股票。那么就是和之前某一天买股票的钱构成差价项,只不过这个price由dp[i-1][0]表示,但其可能是 dp[i][
1] = max(dp[i-1][1], + prices[i] + dp[i-1][0]) return dp[-1][-1]
                  写这一项需要考虑这是第几次买股票,如果不区分第几次那可以退化成1次,后面的卖也一样
dp[i][0] = max(今天没发生交易,低位没买股票买一下)(之前如果买了股票 再交易就只能卖 但是卖了就不会立即买 不然等于没交易 所以后一项是买)
dp[i][1] = max(今天没发生交易, 高位有股票卖一下)
dp[0][0]为了遵循定义,则需要是负的。dp[0][1]遵循定义则需要是0.