123. 买卖股票的最佳时机 III
注意点:
主要是分清楚五次情况
// dp[j][0]是什么也不操作
// dp[j][1]第一次持有股票
// dp[j][2]第一次卖出股票
// dp[j][3]第二次持有股票
// dp[j][4]第二次卖出股票
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>> dp(len, vector<int>(5));
// dp[j][0]是什么也不操作
// dp[j][1]第一次持有股票
// dp[j][2]第一次卖出股票
// dp[j][3]第二次持有股票
// dp[j][4]第二次卖出股票
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = 0;
dp[0][3] = -prices[0];
dp[0][4] = 0;
for(int j = 1; j<len; j++) {
dp[j][0] = dp[j-1][0];
dp[j][1] = max(dp[j-1][0]-prices[j], dp[j-1][1]);
dp[j][2] = max(dp[j-1][1]+prices[j], dp[j-1][2]);
dp[j][3] = max(dp[j-1][2]-prices[j], dp[j-1][3]);
dp[j][4] = max(dp[j-1][3]+prices[j], dp[j-1][4]);
}
return dp[len-1][4];
}
};
188. 买卖股票的最佳时机 IV
注意点:
主要是搞清楚dp[i][j]的含义以及递推公式,当买的时候,递推公式是大致相似的,卖的时候递推公式也是相似的,所以可以概括为一样的;
dp[i][0]什么也不操作
dp[i][1]第一次买入
dp[i][2]第一次卖出
dp[i][3]第二次买入
dp[i][4]第二次卖出
初始化的时候,二维数组的大小为(price.size()-1) * 2k,第一次买的时候(奇数)是-price[j],第二次卖出(偶数)是0;
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<vector<int>> dp(prices.size(),vector<int>(2*k+1, 0) ); //(price.size()-1) * 2k
for(int i = 1; i <= 2*k; i=i+2) {
dp[0][i] = -prices[0];
}
for(int j = 1; j< prices.size(); j++) {
for(int i = 1; i <= k; i++) {
dp[j][2*i-1] = max(dp[j-1][2*i-2]-prices[j], dp[j-1][2*i-1]);
dp[j][2*i] = max(dp[j-1][2*i-1]+prices[j], dp[j-1][2*i]);
}
}
return dp[prices.size()-1][2*k];
}
};