สมมติว่ามีรายการตัวเลข nums ดำเนินการเลือกตัวเลข (ไม่ใช่ตัวแรกหรือตัวสุดท้าย) ลบออก และเพิ่มคะแนนเท่ากับผลรวมของตัวเลขนั้นและสองตัวข้างเคียง ทำได้หลายครั้ง ต้องการคะแนนสูงสุด
ตัวอย่าง: nums = [2, 3, 4, 5, 6] ผลลัพธ์คือ 39 เลือก 5 ได้ 15, เลือก 4 ได้ 13, เลือก 3 ได้ 11 รวม 39
ขั้นตอนการแก้ปัญหา
n = len(nums), ถ้าn < 3คืน 0- สร้าง DP 2D ขนาด
(n+1) x (n+1) - วน
lenจาก 3 ถึงn:- วน
iจาก 1 ถึงn-len+1:r = i + len - 1- หา
kที่ให้คะแนนมากที่สุด:dp[i][k] + dp[k][r] + nums[k-1] dp[i][r] = max_score + nums[i-1] + nums[r-1]
- วน
- คืน
dp[1][n]
ตัวอย่างโค้ด
class Solution:
def solve(self, nums):
n = len(nums)
if n < 3:
return 0
dp = [[0] * (n + 1) for _ in range(n + 1)]
for length in range(3, n + 1):
for i in range(1, n - length + 2):
r = i + length - 1
ans = 0
for k in range(i + 1, r):
curr = dp[i][k] + dp[k][r] + nums[k - 1]
if curr > ans:
ans = curr
ans += nums[i - 1] + nums[r - 1]
dp[i][r] = ans
return dp[1][n]
ob = Solution()
nums = [2, 3, 4, 5, 6]
print(ob.solve(nums))
อินพุต
[2, 3, 4, 5, 6]
เอาต์พุต
39