Thinking
Let us assume a one-dimensional array dp_buy where dp_buy[i] denotes the minimum cost from day 1 to day i. Then, creating another one-dimensional array dp_profit where dp_profit[i] denotes the max profit from day 1 to day i. Firstly, we need to calculate dy_buy, then dy_profit. dp_buy[i] = min{dp_buy[0]…dp_buy[i-1]}; dp_profit[i] = max{prices[i]-dp_buy[i], dp_profit[i-1]}
State: dp_buy[i], dp_profit[i];
Transformation equation:dp_profit[i] = max{prices[i]-dp_buy[i], dp_profit[i-1]};
Code
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() != 0) {
dp_buy = new int[prices.size()]();
dp_profit = new int[prices.size()]();
// calculate minimum dp_buy, dp_buy[i] = min{dp_buy[0]...dp_buy[i-1]}
dp_buy[0] = prices[0];
for (int i=1; i<prices.size(); i++) {
dp_buy[i] = min(dp_buy[i-1], prices[i]);
}
// dp_profit[i] = max{prices[i]-dp_buy[i], dp_profit[i-1]}
dp_profit[0] = 0;
for (int i=1; i<prices.size(); i++) {
dp_profit[i] = max(prices[i]-dp_buy[i], dp_profit[i-1]);
}
}
int maxProfit = 0;
for (int i=0; i<prices.size(); i++) {
if (dp_profit[i] > maxProfit) {
maxProfit = dp_profit[i];
}
}
return maxProfit;
}
private:
int* dp_buy;
int* dp_profit;
};