188. 买卖股票的最佳时机 IV
作者:
牢景又双叒叕站起来了
,
2024-10-20 17:08:55
,
所有人可见
,
阅读 9
class Solution {
public int maxProfit(int k, int[] prices) {
int n = prices.length;
int[][][] f = new int[n + 1][k + 2][2];//两次机会 3个状态 0 1 2 加上不合法状态-1 整体右移一个单位(i从1开始) 就是 0 1 2 3 答案是k+1)
for (int[][] mat : f) {
for (int[] row : mat) {
Arrays.fill(row, Integer.MIN_VALUE / 2); // 防止溢出
}
}
for (int j = 1; j <= k + 1; j++) {
f[0][j][0] = 0;
}
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] + prices[i]);
f[i + 1][j][1] = Math.max(f[i][j][1], f[i][j - 1][0] - prices[i]);
}
}
return f[n][k + 1][0];
}
}
改题
加入的状态是为了区别次数没有了就不合法了
至少k次
那么就不需要这个状态 右半区间完全打通
恰好k次
那么恰好0次 收益是0 平移1 所以 F【0】【1】【0】=0其余不合法
至少0次呢?? F【0】【0】【0】 =0 其余不合法
区分博客中 吃糖 那个也是有类似的作弊次数 不过那个的影响仅仅是多了一个选项,不改变前面的选项 所以可以用if (i》0)来限制 有条件才转移 这个j的状态会影响前面的交易进行 所以要设置非法状态来 禁止转移