Description Link to heading
123.best-time-to-buy-and-sell-stock-iii
Solution Link to heading
The key point is to find what dp
should denotes and the recursion formula:
dp[i]
denotes only considering first i
days, then by day i
, there are five possible cases:
- no operation, written as
dp[i][0]
; - buy stock once in first
i
days, written asdp[i][1]
:dp[i][1] = max(dp[i - 1][0] - prices[i - 1], dp[i - 1][1])
- sell stock once in first
i
days, written asdp[i][2]
:dp[i][2] = max(dp[i - 1][1] + prices[i - 1], dp[i - 1][2])
- by stock twice in first
i
days, written asdp[i][3]
:dp[i][3] = max(dp[i - 1][2] - prices[i - 1], dp[i - 1][3])
- sell stock twice in first
i
days, written asdp[i][4]
:dp[i][4] = max(dp[i - 1][3] + prices[i - 1], dp[i - 1][4])
Initializaiton:
dp[0][0] = 0;
dp[0][1] = -prices[0];
// buy oncedp[0][2] = 0;
// buy->selldp[0][3] = -prices[0];
// buy->sell->buydp[0][4] = 0;
// buy->sell->buy->sell
Code Link to heading
#include <vector>
using std::vector;
class Solution {
public:
int maxProfit(vector<int> &prices) {
vector<vector<int>> dp(prices.size() + 1, vector<int>(5, 0));
dp[0][1] = -prices[0];
dp[0][3] = -prices[0];
for (int i = 1; i <= prices.size(); i++) {
dp[i][1] = max(dp[i - 1][0] - prices[i - 1], dp[i - 1][1]);
dp[i][2] = max(dp[i - 1][1] + prices[i - 1], dp[i - 1][2]);
dp[i][3] = max(dp[i - 1][2] - prices[i - 1], dp[i - 1][3]);
dp[i][4] = max(dp[i - 1][3] + prices[i - 1], dp[i - 1][4]);
}
return dp[prices.size()][4];
}
};