爬楼梯
- 满足条件才更新dp公式:if (j >= i * i && dp[j - i * i] != Integer.MAX_VALUE)
本题内外层顺序无关这里我写的是外层物品,内层背包(但是,这个题内外反过来也可以)
dp五步曲:
- dp[i] 表示和为 i 的完全平方数的最小数量
- 递推公式:dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
- 初始化(同 322. 零钱兑换)
dp[0]=0;
其他的初始化为正无穷
- 遍历顺序
本题内外层顺序无关,这里我写的是外层物品,内层背包
for (int i = 1; i < dp.length; i++) // 外层物品,内层背包
for (int j = i * i; j < dp.length; j++) // 内层背包
- 打印dp
爬楼梯
这个题之前那样写的只能处理一次上一层、两层,但是如果一次能上1,2,...或 m 层呢?
如果是每次只能上小于m的奇数步的话,只用采取一个数组 steps 存放每次可以上楼梯的方案就行
那之前的就不太好写了,这时候其实这是个完全背包问题,因为:
- 每次上的楼梯数(1阶,..m阶)看成物品,楼顶台阶数就是背包容量
- 每个台阶数(相当于物品)可以重复使用,所以是完全背包
- 然后,求得是能上到楼顶(相当于吧背包装满)的方案数量
- 好了好了,背包装满的方案数量,就有如此相像。那不就是组合数或者排列数嘛!
- 这个肯定是排列数,因为(1,2)和(2,1)是两种不同的方法
既然转化成求完全背包的排列数问题,那么就是套模板了
dp五步曲:
- dp[i] 表示上到第 i 层的方案树
- 完全背包(排列数固定递推公式):dp[j] += dp[j - i];
- 初始化:dp[0] = 1;
排列数固定初始化。又因为方案均为正数,其他的初始化为0就行了
- 遍历顺序(排列数:必须是外层背包,内层物品)
- 打印 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排序