State machine graph
/**
* state machine approach
* state a(hold): hold stack, sell or rest
* state b(sold): just sold stack can only rest
* state c(rest): cooldown, buy or rest
* translate to formula,
* stateA = max(preStateA, preStateC-prices[i])
* stateB = preStateA+prices[i]
* stateC = max(preStateB, preStateC)
*/
public class Solution {
public int maxProfit(int[] prices) {
if (prices.length < 2) return 0;
// initialization
int hold = -prices[0];
int sold = Integer.MIN_VALUE;
int rest = 0;
for (int i=1; i<prices.length; i++) {
int preHold = hold;
hold = Math.max(hold, rest-prices[i]);
rest = Math.max(rest, sold);
sold = preHold + prices[i];
}
return Math.max(sold, rest);
}
}