算法day49|121,122

49 第八章 动态规划

  • 121. 买卖股票的最佳时机
  • 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机

dp数组的定义:

定义二维数组,如果dp[i][0]第i天持有股票的最大利润,dp[i][1]第i天不持有股票的最大利润。持有不代表买入卖出,也有可能是留着不变。如果定义为第i天卖出买入股票的话,还需要定义其他的状态。

递推公式的推导:

状态1

当前状态是dp[i][0]第i天持有股票

有两种状态,前一天也持有股票:dp[i-1][0]。第二种是,第i天买入股票:-price[i]

公式:dp[i][0] = max(dp[i-1][0],-price[i])

状态2

当前状态是dp[i][1]第i天不持有股票

有两种状态,前一天也不持有股票:dp[i-1][1]。第二种是,第i天卖出入股票:dp[i-1][0](前一天是持有这个股票的状态)+price[i](卖出股票得到的利润)

公式:dp[i][0] = max(dp[i-1][1],dp[i-1][0]+price[i])

初始化

dp[0][0]第0天持有这个股票的话,-price[0]

dp[0][1]第0天不持有这个股票,0

动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili

代码随想录

二刷(未ac)

var maxProfit = function(prices) {
    let dp =  new Array(prices.length).fill(0).map(()=>new Array(2).fill(0))
    // dp[i][0]代表持有股票,dp[i][1]代表不持有股票
    dp[0][0] = -prices[0]
    dp[0][1] = 0
    for(let i = 1;i<prices.length;i++){
        // 第i 天买入股票,前几天就买入股票了
        dp[i][0] = Math.max(-prices[i],dp[i-1][0])
        // 第i 天卖出股票,一直都不持有,当天卖出
        dp[i][1] = Math.max(dp[i-1][0]+prices[i],dp[i-1][1])
    }
    return dp[prices.length-1][1]
    
};

122.买卖股票的最佳时机II

递推公式有所区别,因为可以多次买卖。

状态1

当前状态是dp[i][0]第i天持有股票

有两种状态,前一天也持有股票:dp[i-1][0]。第二种是,第i天买入股票:dp[i-1][1]-price[i]。(i-1天不持有股票的时候的最大金额,因为那时候已经有钱了,所以不是0)

公式:dp[i][0] = max(dp[i-1][0],-price[i])

状态2

当前状态是dp[i][1]第i天不持有股票

有两种状态,前一天也不持有股票:dp[i-1][1]。第二种是,第i天卖出入股票:dp[i-1][0](前一天是持有这个股票的状态)+price[i](卖出股票得到的利润)

公式:dp[i][0] = max(dp[i-1][1],dp[i-1][0]+price[i])

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp = [[0]*2 for _ in range(len(prices))]
        dp[0][0] = -prices[0]
        dp[0][1] = 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] = max(dp[i-1][1],dp[i-1][0]+prices[i])
        return max(dp[len(prices)-1][0],dp[len(prices)-1][1])

动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II_哔哩哔哩_bilibili

代码随想录

代码随想录

二刷

var maxProfit = function(prices) {
    // dp[i][0]代表持有,dp[i][1]代表不持有
    let dp = new Array(prices.length).fill(0).map(()=>new Array(2).fill(0))
    // 初始化
    dp[0][0] = -prices[0]
    dp[0][1] = 0
    for(let i = 1;i<prices.length;i++){
        // i天买入,前几天就买入
        dp[i][0] = Math.max(dp[i-1][1]-prices[i],dp[i-1][0])
        // i天卖出,前几天就卖出
        dp[i][1] = Math.max(dp[i-1][0]+prices[i],dp[i-1][1])

    }
    return dp[prices.length-1][1]
    
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值