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]
};