สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และค่า x และ y สองค่า เราต้องหาผลรวมสูงสุดของรายการย่อยที่ไม่ทับซ้อนกันสองรายการในหน่วย num ซึ่งมีความยาว x และ y
ดังนั้นหากอินพุตเป็น nums =[3, 2, 10, -2, 7, 6] x =3 y =1 ผลลัพธ์จะเป็น 22 เนื่องจากรายการย่อยที่มีความยาว 3 เราเลือก [3, 2, 10] และอีกอันเราเลือก [7].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- P :=รายการที่มีองค์ประกอบเดียว 0
- สำหรับแต่ละ x ใน A ทำ
- แทรก (องค์ประกอบสุดท้ายของ P + x) ที่ส่วนท้ายของ P
- กำหนดฟังก์ชัน Solve() นี่จะใช้เวลา len1, len2
- Q :=รายการที่มีองค์ประกอบ (P[i + len1] - P[i]) สำหรับแต่ละ i ในช่วง 0 ถึงขนาดของ P - len1
- คำนำหน้า :=สำเนาของ Q
- สำหรับ i ในช่วง 0 ถึงขนาดของคำนำหน้า - 1 ทำ
- คำนำหน้า[i + 1] :=สูงสุดของคำนำหน้า[i + 1] และคำนำหน้า[i]
- ตอบ :=-อินฟินิตี้
- สำหรับฉันในช่วง len1 ถึงขนาด P - len2 ทำ
- left :=prefix[i - len1]
- ขวา :=P[i + len2] - P[i]
- ans :=สูงสุดของ ans และ (ซ้าย + ขวา)
- คืนสินค้า
- จากวิธีหลัก ให้ทำดังนี้ -
- คืนค่าสูงสุดของ Solve(len1, len2) , dissolve(len2, len1)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution:
def solve(self, A, len1, len2):
P = [0]
for x in A:
P.append(P[-1] + x)
def solve(len1, len2):
Q = [P[i + len1] - P[i] for i in range(len(P) - len1)]
prefix = Q[:]
for i in range(len(prefix) - 1):
prefix[i + 1] = max(prefix[i + 1], prefix[i])
ans = float("-inf")
for i in range(len1, len(P) - len2):
left = prefix[i - len1]
right = P[i + len2] - P[i]
ans = max(ans, left + right)
return ans
return max(solve(len1, len2), solve(len2, len1))
ob = Solution()
nums = [3, 2, 10, -2, 7, 6]
x = 3
y = 1
print(ob.solve(nums, x, y)) อินพุต
[3, 2, 10, -2, 7, 6], 3, 1
ผลลัพธ์
22