gpt4 book ai didi

python - 买卖股票动态规划的最佳时机

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:28 25 4
gpt4 key购买 nike

试图解决this : 假设您有一个数组,其中第 i 个元素是给定股票在第 i 天的价格。

设计一个算法来寻找最大利润。您最多可以完成两笔交易。

解决方法:我正在做的是一种分而治之的方法。

dp[i][j] 是第 ith<​​/em> 天和 jth 天之间的最大利润。计算如下:

dp[i][j] = max(dp[i][j], max(价格[i] - 价格[j], dp[k][j], dp[i][k +1])),其中 k 小于 i 且大于 j。

现在我们只需要在下面找出两笔交易中的最大利润:

m = max(m, max(dp[i][j], dp[k][j] + dp[i][k+1]))

请给我提示以解决此问题,因为此处提供的现有解决方案已超时。

class Solution(object):
def profit(self, prices, dp):
m = 0
for w in range(1, len(prices)):
for i in range(1, len(prices)):
for j in range(i-w, i):
if i-w < 0:
continue
for k in range(j, i):
dp[i][j] = max(dp[i][j], max(prices[i] - prices[j], dp[k][j], dp[i][k+1]))
m = max(m, max(dp[i][j], dp[k][j] + dp[i][k+1]))
return m

def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
dp = [[0 for i in range(len(prices)+1)] for i in range(len(prices)+1)]
return self.profit(prices, dp)

最佳答案

一个提示是对价格进行预处理,并找出以索引 i 结尾的价格出售可以获得的最大利润。然后,您可以从预处理向量的末尾开始找出问题的解决方案。这将解决使用 1-D DP 的问题,并且不会超时。

  int maxProfit(vector<int>& prices) {

int mprof = 0;
if (prices.size()>1){
int maxprof = 0;
vector<int> mp; // max profit before each element
mp.push_back(0);
int st = *prices.begin();
for(int i = 1 ; i<=prices.size();i++){ //compute mp vector
if (mprof < prices[i]-st){mprof = prices[i]-st;}
if (prices[i]<st){st = prices[i];}
mp.push_back(mprof);
}
mprof = 0;
int ed = *(prices.end()-1);
for (int i = prices.size()-2; i>=0; i--){
if (mprof < ed - prices[i] + mp[i]) { mprof = ed - prices[i] + mp[i];}
if (prices[i]>ed) {ed = prices[i];}
}
}
return mprof;

}

关于python - 买卖股票动态规划的最佳时机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46641011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com