สมมติว่าเรามีรายการตัวเลข nums เราต้องการหาผลรวมสูงสุดของตัวเลขที่ไม่ติดกัน (non-adjacent) ตัวเลขอาจเป็น 0 หรือลบก็ได้
ตัวอย่างเช่น หาก [3, 5, 7, 3, 6] ผลลัพธ์จะเป็น 16 เนื่องจากเลือก 3, 7, และ 6 ได้ 16
ขั้นตอนการแก้ปัญหา (Dynamic Programming - House Robber Pattern)
- หาก
len(nums) <= 2ให้คืนค่าmax(nums) noTake = 0(ไม่เอาตัวก่อนหน้า),take = nums[0](เอาตัวก่อนหน้า)- วนลูป
iจาก 1 ถึงlen(nums) - 1:take, noTake = noTake + nums[i], max(noTake, take)
- คืนค่า
max(noTake, take)
ตัวอย่างโค้ด Python
class Solution:
def solve(self, nums):
if len(nums) <= 2:
return max(nums)
noTake = 0
take = nums[0]
for i in range(1, len(nums)):
take, noTake = noTake + nums[i], max(noTake, take)
return max(noTake, take)
ob = Solution()
nums = [3, 5, 7, 3, 6]
print(ob.solve(nums)) # Output: 16
อินพุต
[3, 5, 7, 3, 6]
เอาต์พุต
16