← 返回目录

664. 奇怪的打印机

第 23 / 42 卷日期:

1682. 最长回文子序列 II(plus会员)

1690. 石子游戏 VII 1745. 回文串分割 IV

1000. 合并石头的最低成本

664. 奇怪的打印机

  1. 确定dp数组含义和下标:dp[i][j] 为 [i, j] 区间的最小打印次数
  2. 递推公式:对于区间,可以从边界开始考虑
  3. 当s[i] == s[j]时,打印 s[i] 时顺便就可以打印 s[j],中间的区域是可以被覆盖的,所以只考虑边界,只需

要打印一次 i 位置,j 位置也被顺便打印完成,即等于 j 位置不计算的次数,所以 dp[i][j] = dp[i][j - 1]

  1. 当s[i] != s[j]时,可以分为两个区间,[i, k]和[k + 1, j], k 取 [i, j),此时只要找到两个区间d打印次数之和

最小的次数即可,即 dp[i][j] = min(dp[i][k] + dp[k + 1][j])

  1. 初始化:考虑到区间长度为1,即 i == j 时,dp[i][i] = 1
  2. 遍历顺序:i 从大到小,j 从小到大,因为在 s[i] != s[j] 的情况下,dp[i][j] 依赖于 dp[i][k], dp[k + 1][j]
  3. 如果 i 从 0 开始,k 从 i 开始,那么对于dp[k + 1][j],左边界取的是 i + 1,此时可能就没有被遍历过
  4. 如果 i 从 n - 1 开始,k 从 i 开始,那么对于dp[k +1][j],左边界取的是 i + 1,此时 i 是倒序遍历,所以

dp[k + 1][j] 肯定被遍历过了

  1. j 同理,只有从 i + 1开始,k 从 i 开始,dp[i][k]才会被遍历过,保证无后效性

BFS

图 28-1
图 28-1

一些实现细节:

  1. 是否访问的标识一定要处理好,不然就炸了
  2. 根据题意,选择使用邻接矩阵、邻接表存储图(偏向邻接表)
  3. 和背包模型一样,要学会抽象
全站分卷索引 · 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排序