最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。假设阿福已经准确预测出了某只股票在未来 $N$ 天的价格,他希望买卖两次,使得获得的利润最高。为了计算简单起见,利润的计算方式为卖出的价格减去买入的价格。同一天可以进行多次买卖。但是在第一次买入之后,必须要先卖出,然后才可以第二次买入。现在,阿福想知道他最多可以获得多少利润。c++
时间: 2024-03-13 21:48:09 浏览: 64
以下是一个求解这个问题的 C++ 代码,使用了动态规划的思想:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n < 2) return 0;
vector<int> firstBuy(n, 0); // 第一次买入的最大收益
vector<int> firstSell(n, 0); // 第一次卖出的最大收益
vector<int> secBuy(n, 0); // 第二次买入的最大收益
vector<int> secSell(n, 0); // 第二次卖出的最大收益
firstBuy[0] = -prices[0]; // 第一次买入的最大收益是 -prices[0]
firstSell[0] = 0;
secBuy[0] = -prices[0];
secSell[0] = 0;
for (int i = 1; i < n; i++) {
firstBuy[i] = max(firstBuy[i-1], -prices[i]); // 第一次买入的最大收益
firstSell[i] = max(firstSell[i-1], prices[i] + firstBuy[i-1]); // 第一次卖出的最大收益
secBuy[i] = max(secBuy[i-1], firstSell[i-1] - prices[i]); // 第二次买入的最大收益
secSell[i] = max(secSell[i-1], prices[i] + secBuy[i-1]); // 第二次卖出的最大收益
}
return secSell[n-1]; // 返回第二次卖出的最大收益
}
int main() {
vector<int> prices = {3, 3, 5, 0, 0, 3, 1, 4};
cout << maxProfit(prices) << endl; // 输出:6
return 0;
}
```
该算法的时间复杂度为 $O(n)$,其中 $n$ 是股票价格序列的长度。