一、问题描述
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
二、思路
用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。最多交易两次,手上最多只能持有一支股票,求最大收益。
分析:动态规划法。以第i天为分界线,计算第i天之前进行一次交易的最大收益preProfit[i],和第i天之后进行一次交易的最大收益postProfit[i],最后遍历一遍,max{preProfit[i] + postProfit[i]} (0≤i≤n-1)就是最大收益。第i天之前和第i天之后进行一次的最大收益求法同Best Time to Buy and Sell Stock I。
三、代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() < 2)
return 0;
int n = prices.size();
vector<int> preProfit(n,0);
vector<int> postProfit(n,0);
int pre_profit = prices[0];
for(int i = 1; i < n; ++i){
pre_profit = min(pre_profit, prices[i]);
preProfit[i] = max(preProfit[i - 1], prices[i] - pre_profit);
}
int post_profit = prices[n - 1];
for(int i = n -2; i >= 0; --i){
post_profit = max(post_profit, prices[i]);
postProfit[i] = max(postProfit[i + 1], post_profit - prices[i]);
}
int max_p = 0;
for(int i = 0; i < n; ++i)
max_p = max(max_p, preProfit[i] + postProfit[i]);
return max_p;
}
};