思路:
与之前的股票问题不同的是,这里设置三维数组的dp,动态规划
代码:
class Solution {
public int maxProfit(int k, int[] prices) {
int n=prices.length;
int[][][] dp=new int[n][k][2];
if(n<2||k==0) return 0;
//n表示下标,k表示第几笔交易,2表示状态
//只有2种状态
//不持股(0)
//持股(1)
//初始化持股的情况,状态0的初始化放在核心代码里一起,就不会浪费循环时间了
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
dp[i][j][1]=Integer.MIN_VALUE;
}
}
//要分别判断i==0与j==0时的情况
//i==0代表第一个元素初始化
//j==0代表第一笔交易初始化
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
if(i==0){
dp[i][j][0]=0;
dp[i][j][1]=-prices[0];
}else{
if(j==0){
dp[i][j][1]=Math.max(dp[i-1][j][1],-prices[i]);
}else{
dp[i][j][1]=Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
}
dp[i][j][0]=Math.max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
}
}
}
return dp[n-1][k-1][0];
}
}
分解:
1)三维数组dp:
int[][][] dp=new int[n][k][2];
n:哪个元素
k:第几笔交易
2:2种状态:(0不持股,1持股)
2)初始化持股的情况即可,状态0不持股的初始化放在核心代码里一起,就不会浪费循环时间了
3)核心代码中,分i==0和j==0的情况:
i)i==0起始就是初始化第一个元素
ii)j==0 主要是dp[][][1]的情况,持股的情况
因为持股的前一个状态是不持股,前一个的不持股与当前的持股是不同的交易笔数
4)注意n<2||k==0的判空