炒股怎么炒?用动态规划啊!
编程三分钟
共 11199字,需浏览 23分钟
·
2021-09-13 23:52
说在前面
引例:只能交易一次
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
一、动态数组定义
dp[i][j]
,表示持股情况为i
,第 j
天结束,情况下,手中的最大利润。i
代表是否持股,i=0
不持股,i=1
持股j
代表第j
天
j
列的二维数组。二、状态转移方程
dp[0][j]
:表示该天不持股dp[0][j] = dp[0][j-1]
dp[0][j] = dp[1][j-1] + prices[j]
dp[0][j] = max(dp[0][j-1], dp[1][j-1] + prices[j])
dp[1][j]
:表示该天持股dp[1][j] = dp[1][j-1]
dp[1][j] = -prices[j]
dp[1][j] = max(dp[1][j-1], -prices[j])
三、初始化
dp[0][0] = 0
dp[1][0] = -prices[0]
max_profit = dp[0][-1]
def maxProfit(self, prices):
size = len(prices)
if size == 0 or size == 1:
return 0
# 定义动态数组
dp = [[0 for _ in range(size)] for _ in range(2)]
# 初始化动态数组
dp[0][0] = 0
dp[1][0] = -prices[0]
# 动态方程
for j in range(1, size):
dp[0][j] = max(dp[0][j - 1], dp[1][j - 1] + prices[j])
dp[1][j] = max(dp[1][j - 1], -prices[j])
return dp[0][-1]
四、优化
def maxProfit_opt(self, prices):
size = len(prices)
if size == 0 or size == 1:
return 0
dp1 = 0
dp2 = -prices[0]
for j in range(1, size):
tmp1 = max(dp1, dp2+prices[j])
tmp2 = max(dp2, -prices[j])
dp1, dp2 = tmp1, tmp2
return dp1
无限制买卖
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
一、动态数组定义
dp[i][j]
,表示持股情况为i
,第 j
天结束,情况下,手中的最大利润。i
代表是否持股,i=0
不持股,i=1
持股j
代表第j
天
j
列的二维数组。二、状态转移方程
dp[0][j]
:表示该天不持股dp[0][j] = dp[0][j-1]
dp[0][j] = dp[1][j-1] + prices[j]
dp[0][j] = max(dp[0][j-1], dp[1][j-1] + prices[j])
dp[1][j]
:表示该天持股dp[1][j] = dp[1][j-1]
dp[1][j] = dp[0][j-1] - prices[j]
dp[1][j] = max(dp[1][j-1], dp[0][j-1] - prices[j])
三、初始化
dp[0][0] = 0
dp[1][0] = -prices[0]
dp[0]
的最后一个元素就是最大利润值,因为不持股手中的利润就是多的情况。max_profit = dp[0][-1]
def maxProfit(self, prices):
size = len(prices)
if size == 0 or size == 1:
return 0
# 定义动态数组
dp = [[0 for _ in range(size)] for _ in range(2)]
# 初始化动态数组
dp[0][0] = 0
dp[1][0] = -prices[0]
# 动态方程
for j in range(1, size):
dp[0][j] = max(dp[0][j - 1], dp[1][j - 1] + prices[j])
dp[1][j] = max(dp[1][j - 1], dp[0][j - 1] - prices[j])
print(dp)
return dp[0][-1]
四、优化
def maxProfit_opt(self, prices):
size = len(prices)
if size == 0 or size == 1:
return 0
# 初始化动态数组
dp1 = 0
dp2 = -prices[0]
for j in range(1, size):
tmp1 = max(dp1, dp2 + prices[j])
tmp2 = max(dp2, dp1 - prices[j])
dp1, dp2 = tmp1, tmp2
return dp1
交易 2 次,最大利润?
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
一、动态数组定义
dp[i][j]
,代表进行 i
次交易,在第 j
天的时候的最大利润。i
代表交易次数j
代表天数
二、状态转移方程
dp[i][j]=max{dp[i][j-1], max{prices[i]-prices[n]+dp[i-1][n]}}, n=0,1,…,j-1
三、初始化
dp[0]=0
:如果一直进行 0 次交易。那么,无论到第几天,利润都为 0dp[1][0]
:第 0 天,进行 1 次交易,无论是买、卖还是买+卖都进行,最大利润必为 0dp[2][0]
:第 0 天,进行 2 次交易,无论是买、卖还是买+卖都进行,最大利润还为 0i=1
这一行。i=2
这一行填完,大家的思路会更加清晰起来。困难
,而困难点就在这里。四、优化
prices[4]- prices[0]+dp[0][0]
prices[4]-prices[1]+dp[0][1]
prices[4]-prices[2]+dp[0][1]
prices[4]-prices[3]+dp[0][1]
prices[5]- prices[0]+dp[0][0]
prices[5]-prices[1]+dp[0][1]
prices[5]-prices[2]+dp[0][1]
prices[5]-prices[3]+dp[0][1]
prices[5]-prices[4]+dp[0][1]
max_profit
来进行记录右侧被标记部分的最大值。dp[i][j]=max{dp[i][j-1], max{prices[i]-prices[n]+dp[i-1][n]}}, n=0,1,…,j-1
dp[i][j]=max{dp[i][j-1], prices[j]+max_profit}
max_profilt=max{dp[i-1][j]-prices[j], max_profit}
def maxProfit(self, prices):
"""
使用动态规划解决: 最多完成 2 次交易
"""
size = len(prices)
if size == 0:
return 0
dp = [[0 for _ in range(size)] for _ in range(3)]
print(dp)
for i in range(1, 3):
# 每一次交易的最大利润
max_profit = -prices[0]
for j in range(1, size):
dp[i][j] = max(dp[i][j-1], max_profit + prices[j])
max_profit = max(max_profit, dp[i-1][j] - prices[j])
print(dp)
return dp[-1][-1]
交易多次,最大利润?
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
def maxProfit(self, k, prices):
size = len(prices)
if size == 0:
return 0
dp = [[0 for _ in range(size)] for _ in range(k+1)]
print(dp)
for i in range(1, k+1):
# 每一次交易的最大利润
max_profit = -prices[0]
for j in range(1, size):
dp[i][j] = max(dp[i][j-1], max_profit + prices[j])
max_profit = max(max_profit, dp[i-1][j] - prices[j])
print(dp)
return dp[-1][-1]
也可围观我的朋友圈不定时分享有关互联网各种干货和趣事,或者还有许多不痛不痒的事情,总之乱七八糟吧哈!
开心最好。
坑位紧缺,票圈开业期待大家的光临!
评论