1. # 子列, 不是子串
  2. # dp[i]:以i结尾的最长递增字串
  3. def LengthOfLIS(nums: [int]) -> int:
  4. dp = [1 for i in range(len(nums))]
  5. for i in range(len(nums)):
  6. for j in range(i):
  7. if nums[i] > nums[j]:
  8. # 状态转移方程
  9. dp[i] = max(dp[i], dp[j] + 1)
  10. print(dp)
  11. return max(dp)
  12. # 朴素, dp[i]: i之前的最长递增字串
  13. def BruteLengthOfLIS(nums: [int]) -> int:
  14. max_end_of_i = [1 for i in range(len(nums))]
  15. dp = [1 for i in range(len(nums))]
  16. for i in range(len(nums)):
  17. for j in range(i):
  18. if nums[i] > nums[j]:
  19. max_end_of_i[i] = max(max_end_of_i[i], max_end_of_i[j] + 1)
  20. for i in range(1, len(nums)):
  21. dp[i] = max(dp[i - 1], max_end_of_i[i])
  22. print(dp)
  23. return dp[-1]
  24. target = [10, 9, 2, 5, 3, 7, 101, 18]
  25. print(LengthOfLIS(target))
  26. print(BruteLengthOfLIS(target))

总结

  • dp的含义不一定直接就是问题的解, 有时候dp是间接的, dp定义需要谨慎