思路
该题是买卖k次股票。和买卖两次是一样的。
LeetCode123. 买卖股票的最佳时机 III_想进阿里的小菜鸡的博客-CSDN博客
只是需要把内层循环的所有dp[i][j]中的j给全部找出来就好了,买卖k次有k*2种j。如果下标还是从0开始的话会产生k*2个dp[i][j]会很麻烦,要是用奇数来表示持有,偶数表示不持有时的最大价值。则会比较简单。就是将之前题的奇偶反转下就可以了。
// 股票状态: 奇数表示第 k 次交易持有/买入, 偶数表示第 k 次交易不持有/卖出, 0 表示没有操作
初始化的时候也就是奇数买入的全部为-prices[0]; 其他全部一样即可。
代码
class Solution {
public int maxProfit(int k, int[] prices) {
if(prices.length ==0){
return 0;
}
int dp[][] = new int[prices.length][k*2+1];
for(int i =1;i<k*2;i+=2){
dp[0][i] = -prices[0];
}
for(int i =1;i<prices.length;i++){
for(int j =0;j<k*2-1;j+=2){
dp[i][j+1]=Math.max(dp[i-1][j]-prices[i],dp[i-1][j+1]);
dp[i][j+2]=Math.max(dp[i-1][j+2],dp[i-1][j+1]+prices[i]);
}
}
return dp[prices.length-1][k*2];
}
}