image.png

思路

这里是买卖k次,其实就是把之前买卖2次那道题抽象了出来。
买卖2次,5种状态
买卖k次,2k+1种状态。
然后分奇偶讨论。
注意:循环变量是 i+1,i+2这样子的,

var maxProfit = function(k, prices) {
    // 有k次买卖,那么就是2k+1个状态(买、卖、初始0)
    // 奇数是买入,偶数是卖出

  //题目数据可以取到0,所以提前判断,否则后面会报错
    if(prices===null||prices.length<2||k===0) return 0

    let dp =new Array(prices.length).fill(0).map(()=>new Array(2*k+1).fill(0))
    //i的条件是i+2
    for(let i=1;i<2*k;i+=2){
        dp[0][i] =-prices[0] //奇数,即买入时的初始值都是-prices[0]
    }

    for(let i=1;i<prices.length;i++){
      //j的条件是j+2
        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]
};