时间序列模型
- 本题选择在卖出股票时支付手续费
dp 五步曲:
- 确定 dp 及其含义
- 每天只有 2 个状态
- dp[i]: 第 i 天持有股票获得的最大现金
- dp[i]: 第 i 天卖出股票获得的最大现金
- int[] dp = new int[n];
- 递推公式
- dpi = Math.max(dpi - 1, dpi - 1 - prices[i]);
- 今天不买入,则保持前一天买入状态,为 dp[i] - 1
- 今天买入,则需要在前一天卖出的基础上减去今天的股票价格,为 dp[i] - 1 - prices[i]
- 二者,取 max
- dp[i] = Math.max(dp[i] - 1, dp[i] - 1 + prices[i] - fee);
- 这里要多剪去一个手续费
- 今天不卖出,则保持前一天卖出状态,为 dp[i] - 1
- 今天卖出,则需要在前一天买入的基础上加上今天的股票价格,再减去手续费
- 取 max
- 初始化
- dp[0] = -prices[0];
- 其他为 0
- 顺序:从前到后
- 打印 dp
时间序列模型
时间序列模型(给出一个序列(数组/字符串),其中每一个元素可以认为“一天”,并且“今天”的状态只取决于“昨天”的状态(无后效性?))
后无效性:
思路:
- 确定dp数组dp[i][j](第ith轮的第j种状态);
- 画图,千方百计的将dp[i][j]和前一轮的状态dp[i-1][j]产生关系(确定状态转移方程);
- 确定基础值,最后开始硬编(感觉这种模型的dp真套路,不过有时候无法通过题目定位出是这种类型的题
目)

举例说明:LC_487. 最大连续1的个数 II

代表性的题目:打家劫舍系列、股票系列,打家劫舍III运用了树形DP。
时间序列模型(状态机模型),这种类型的题目,在确定dp的数组和下标的含义之后,状态的转换可以通过话状态图得到
之后的初始化等操作也就自然就出来了。
或者说是后序遍历的深入理解吧,需要明确当前层构成的结果如何计算,以及需要向上传递什么结果。可以先从二叉树的路径问题入手理解。
原图链接:「代码随想录」知识星球

全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序