188.买卖股票的最佳时机IV
class Solution {
public int maxProfit(int k, int[] prices) {
int n =prices.length;
int[][][] f = new int [n+1][k+2][2];
// initialize
for(int[][] mat:f){
for(int[] row : mat){
Arrays.fill(row, Integer.MIN_VALUE / 2); // prevent from overflow
}
}
for(int j=1; j<=k+1; j++){
f[0][j][0] = 0;
}
// dp process
for(int i=0; i<n; i++){
for(int j=1; j<=k+1; j++){
f[i+1][j][0] = Math.max(f[i][j][0],f[i][j-1][1]+prices[i]);
f[i+1][j][1] = Math.max(f[i][j][1], f[i][j][0]-prices[i]);
}
}
return f[n][k+1][0];
}
}
309.最佳买卖股票时机含冷冻期
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
int[][] dp = new int[n+2][2];
dp[1][1] = Integer.MIN_VALUE;
for(int i=0; i<n; i++){
dp[i+2][0] = Math.max(dp[i+1][1]+prices[i], dp[i+1][0]);
dp[i+2][1] = Math.max(dp[i+1][1],dp[i][0]-prices[i]);
}
return dp[n+1][0];
}
}
714.买卖股票的最佳时机含手续费
class Solution {
public int maxProfit(int[] prices, int fee) {
int n = prices.length;
int[][] f = new int[n+1][2];
f[0][0] = 0;
f[0][1] = Integer.MIN_VALUE/2;
for(int i=0; i<n; i++){
f[i+1][0] = Math.max(prices[i]-fee+f[i][1], f[i][0]);
f[i+1][1] = Math.max(f[i][0]-prices[i], f[i][1]);
}
return f[n][0];
}
}