代码随想录算法训练营第五十天
123.买卖股票的最佳时机III
代码
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2022.12
# @Author : hello algorithm!
# @Note : https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/
from typing import List
class Solution:
"""
一天一共就有五个状态,
0. 没有操作,是指整个过程没有操作
1. 第一次买入
2. 第一次卖出
3. 第二次买入
4. 第二次卖出
dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。
dp[i][0] = dp[i - 1][0]
dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1])
dp[i][2] = max(dp[i-1][1]+prices[i],dp[i-1][2])
dp[i][3] = max(dp[i-1][2]-prices[i],dp[i-1][3])
dp[i][4] = max(dp[i-1][3]+prices[i],dp[i-1][4])
"""
def maxProfit(self, prices: List[int]) -> int:
dp = [[0 for _ in range(5)] for _ in range(len(prices))]
dp[0][0] = 0
dp[0][1] = -prices[0]
dp[0][2] = 0
dp[0][3] = -prices[0]
dp[0][4] = 0
for i in range(1, len(prices)):
dp[i][0] = dp[i - 1][0]
dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])
dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3])
dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4])
if dp[-1][-1] < 0:
return 0
return dp[-1][-1]
if __name__ == '__main__':
prices = [2,4,1]
s = Solution()
print(s.maxProfit(prices))
188.买卖股票的最佳时机IV
代码
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2022.12
# @Author : hello algorithm!
# @Note : https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/
from typing import List
class Solution:
"""
一天一共就有五个状态,
0. 没有操作,是指整个过程没有操作
1. 第一次买入
2. 第一次卖出
3. 第二次买入
4. 第二次卖出
dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。
dp[i][0] = dp[i - 1][0]
dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1])
dp[i][2] = max(dp[i-1][1]+prices[i],dp[i-1][2])
dp[i][3] = max(dp[i-1][2]-prices[i],dp[i-1][3])
dp[i][4] = max(dp[i-1][3]+prices[i],dp[i-1][4])
"""
def maxProfit(self, k: int, prices: List[int]) -> int:
dp = [[0 for _ in range(2 * k + 1)] for _ in range(len(prices))]
for i in range(1, 2 * k + 1, 2):
dp[0][i] = -prices[0]
for i in range(1, len(prices)):
for j in range(2 * k + 1):
if j == 0:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = max(dp[i - 1][j - 1] + (-1) ** (j % 2) * prices[i], dp[i - 1][j])
if dp[-1][-1] < 0:
return 0
return dp[-1][-1]
if __name__ == '__main__':
prices = [2, 4, 1]
k = 2
s = Solution()
print(s.maxProfit(k, prices))