It took me more than 2 hours trying to solve it by myself.
Failed. My mind was completely in mess. I was frustrated dealing this problem, and finally went to the discuss section and found it can be solved within 10 lines in c++.
GOD!!!!!!! Why DP is so hard!!!! It’s even not a HARD problem!
NVM. It was only two hours, I can afford it.
int maxProfit(vector<int>& prices) {
// free is the maximum profit I can have if I do nothing.
// have is the maximum profit I can have if I buy the current stock.
// sell is the maximum profit I can have if I sell the current stock.
int free = 0, have = INT_MIN, sell = 0;
for(auto p:prices){
int h = have;
have = max(have,free-p); // buy the current stock
free = max(free,sell); // do nothing
sell = h+p; // sell current stock
}
return max(sell,free);
}
I think the key of this problem, is to understand the three situations: buy, sell, cooldown
. Though it has been illustrated clearly in the problem description, however, what we should extract is the relationship between these three situations.
Think about the following situations:
(1) To buy a stock today, requiring that we did nothing yesterday, in other words, no buying, no selling. (since we have a cooldown day after selling).
(2) To sell a stock today, requiring that we have stock already.
(3) For the day doing nothing, inherit yesterday’s result, free =max(free,have,sell)
, since have
must be the smallest one (yesterday bought a stock), so we can write as free = max(free,sell);
For each iteration, the free, have, sell
represent the yesterday’s three possible profits. We just need to update them in each iteration.