← 返回目录

爬楼梯

第 14 / 42 卷日期:

  1. 满足条件才更新dp公式:if (j >= i * i && dp[j - i * i] != Integer.MAX_VALUE)

本题内外层顺序无关这里我写的是外层物品,内层背包(但是,这个题内外反过来也可以)

dp五步曲:

  1. dp[i] 表示和为 i 的完全平方数的最小数量
  2. 递推公式:dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
  3. 初始化(同 322. 零钱兑换)

dp[0]=0;

其他的初始化为正无穷

  1. 遍历顺序

本题内外层顺序无关,这里我写的是外层物品,内层背包

for (int i = 1; i < dp.length; i++) // 外层物品,内层背包

for (int j = i * i; j < dp.length; j++) // 内层背包

  1. 打印dp

爬楼梯

这个题之前那样写的只能处理一次上一层、两层,但是如果一次能上1,2,...或 m 层呢?

如果是每次只能上小于m的奇数步的话,只用采取一个数组 steps 存放每次可以上楼梯的方案就行

那之前的就不太好写了,这时候其实这是个完全背包问题,因为:

  1. 每次上的楼梯数(1阶,..m阶)看成物品,楼顶台阶数就是背包容量
  2. 每个台阶数(相当于物品)可以重复使用,所以是完全背包
  3. 然后,求得是能上到楼顶(相当于吧背包装满)的方案数量
  4. 好了好了,背包装满的方案数量,就有如此相像。那不就是组合数或者排列数嘛!
  5. 这个肯定是排列数,因为(1,2)和(2,1)是两种不同的方法

既然转化成求完全背包的排列数问题,那么就是套模板了

dp五步曲:

  1. dp[i] 表示上到第 i 层的方案树
  2. 完全背包(排列数固定递推公式):dp[j] += dp[j - i];
  3. 初始化:dp[0] = 1;

排列数固定初始化。又因为方案均为正数,其他的初始化为0就行了

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