动态规划问题总结

背包问题

参考:希望用一种规律搞定背包问题

分类

排列组合问题

\[dp[i] += dp[i - num[j]] \]

判断问题(true or false)

\[dp[i] = dp[i] || dp[i - num[j]] \]

最大最小问题

\[dp[i] = min(dp[i], dp[i - num[j]] + 1) \]

或者

\[dp[i] = max(dp[i], dp[i - num[j]] + 1) \]

判定与步骤

背包问题具备的特征:给定一个 targettarget 可以是数字也可以是字符串,再给定一个数组 numsnums 中装的可能是数字,也可能是字符串,问:能否使用 nums 中的元素做各种排列组合得到 target

  1. 分析是否为背包问题
  2. 是三种背包问题的哪一种
  3. 是0-1背包问题还是完全背包问题。也就是题目给的nums数组中的元素是否可以重复使用
  4. 如果是排列组合问题,是否需要考虑元素之间的顺序。排列有排列的解法,组合有组合的解法

代码模板

0-1背包

即数组中的元素不可重复使用

nums 放在外循环,target 在内循环,且内循环倒序

for num in nums:
    for i in range(target, nums - 1, -1):

完全背包(组合)

即数组中的元素可重复使用

nums 放在外循环,target 在内循环,且内循环正序

for num in nums:
    for i in range(nums, target + 1):

完全背包(排列)

需考虑元素之间的顺序,需将 target 放在外循环,将 nums 放在内循环

for i in range(1, target + 1):
    for num in nums:

区间 dp

posted @ 2023-04-19 09:49  Frodo1124  阅读(12)  评论(0编辑  收藏  举报