提示:努力生活,开心、快乐的一天
题目链接:123. 买卖股票的最佳时机 III
达到dp[i][1]状态,有两个具体操作
同理dp[i][2]也有两个操作:
同理可推出剩下状态部分:
动态规划
var maxProfit = function (prices) {
//0:没有操作 (其实我们也可以不设置这个状态)
//1:第一次持有股票
//2:第一次不持有股票
//3:第二次持有股票
//4:第二次不持有股票
let len = prices.length
const dp = new Array(len).fill(0).map(x => new Array(5).fill(0));
dp[0][1] = -prices[0]
dp[0][3] = -prices[0]
for (let i = 1; i < len; i++) {
dp[i][0] = dp[i - 1][0];
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i])
dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
}
return dp[len - 1][4]
};
达到dp[i][1]状态,有两个具体操作
1、 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
2、 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]
dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1])
同理dp[i][2]也有两个操作:
1、操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
2、操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]
dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
同理可推出剩下状态部分:
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
题目链接:188. 买卖股票的最佳时机 IV
达到dp[i][1]状态,有两个具体操作
同理dp[i][2]也有两个操作:
for (let j = 0; j < 2 * k - 1; j += 2) {
dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
}
for (let j = 1; j < 2 * k; j += 2) {
dp[0][j] = -prices[0];
}
动态规划
const maxProfit = (k,prices) => {
if (prices == null || prices.length < 2 || k == 0) {
return 0;
}
let dp = Array.from(Array(prices.length), () => Array(2*k+1).fill(0));
for (let j = 1; j < 2 * k; j += 2) {
dp[0][j] = 0 - prices[0];
}
for(let i = 1; i < prices.length; i++) {
for (let j = 0; j < 2 * k; j += 2) {
dp[i][j+1] = Math.max(dp[i-1][j+1], dp[i-1][j] - prices[i]);
dp[i][j+2] = Math.max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);
}
}
return dp[prices.length - 1][2 * k];
};
买卖次数非定值的时候,最大价值的规律也是有迹可循的
很难,似懂非懂,半知半解的状态