https://leetcode.com/problems/maximum-points-in-an-archery-competition/
经典的背包问题,但是要求输出方案,因此还是要注意一下

题目解答

  1. class Solution:
  2. def maximumBobPoints(self, n: int, a: List[int]) -> List[int]:
  3. @cache
  4. def dp(i, k):
  5. if i <= 0:
  6. return 0
  7. if k < a[i] + 1:
  8. return dp(i - 1, k)
  9. return max(i + dp(i - 1, k - a[i] - 1), dp(i - 1, k))
  10. res = [0] * len(a)
  11. k = n
  12. for i in range(len(a) - 1, 0, -1):
  13. if dp(i, k) != dp(i - 1, k):
  14. res[i] = a[i] + 1
  15. k -= res[i]
  16. res[0] += k
  17. return res

题目分析

没有什么特别好说的:

  • 经典0-1背包的转移方程
  • 边界条件的判断

方案的输出值得注意一下,可以通过值直接对比是否选择了当前方案:dp(i, k) != dp(i - 1, k),依次更新就能得到所有的选择情况了。