-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBest_Time_to_Buy_and_Sell_Stock_III.cpp
36 lines (31 loc) · 1.26 KB
/
Best_Time_to_Buy_and_Sell_Stock_III.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
int maxProfit(vector<int> &prices) {
if(prices.size() <= 1)
return 0;
int size = prices.size(), max_profit = 0;
int dp_forward[size+1], dp_backward[size+1];
memset(dp_forward, 0, sizeof(dp_forward));
memset(dp_backward, 0, sizeof(dp_backward));
int prev_min = prices[0]; dp_forward[0] = 0;
for(int i = 1; i < size; ++i) {
if (dp_forward[i-1] > prices[i] - prev_min)
dp_forward[i] = dp_forward[i-1];
else
dp_forward[i] = prices[i] - prev_min;
prev_min = (prev_min > prices[i] ? prices[i] : prev_min);
}
int following_max = prices[size-1]; dp_backward[size-1] = 0;
for (int i = size - 2; i >= 0; --i) {
if (dp_backward[i+1] > following_max - prices[i])
dp_backward[i] = dp_backward[i+1];
else
dp_backward[i] = following_max - prices[i];
following_max = (following_max > prices[i] ? following_max : prices[i]);
}
for (int i = 0; i <= size - 1; ++i)
if (max_profit < dp_forward[i] + dp_backward[i+1])
max_profit = dp_forward[i] + dp_backward[i+1];
return max_profit;
}
};