/**
* @param {number} k
* @param {number[]} prices
* @return {number}
* 在同一天可以既卖出又买入、既买入又卖出, 只要不超过k笔交易就行
*/
var maxProfit = function(k, prices) {
let n = prices.length
if((k < 1) || prices.length < 2 ) return 0
if((n / 2 | 0) <= k) return maxProfitNoLimit(prices)
const dp = new Array(n)
for(let i = 0; i < n; i++) {
dp[i] = new Array(k + 1)
for(let j = 0; j <= k; j++) dp[i][j] = new Array(2).fill(0)
}
for(let i = 1; i <= k ;i++) dp[0][i][1] = -prices[0]
// 0 不持有,1持有
for(let i = 1; i < n; i++) {
for(let j = 1; j <= k; j++) {
// 每一步都取最大的,总体上就是最大
dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i])
dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i])
}
}
return dp[n - 1][k][0]
};
function maxProfitNoLimit(prices) {
let n = prices.length - 1
let p = 0
for(let i = 0; i < n ; i++) {
if((prices[i + 1] - prices[i]) > 0) {
p += (prices[i + 1] - prices[i])
}
}
return p
}