สมมติว่าเรามีรายการสแต็คและจำนวนเต็ม k เราต้องหาผลรวมสูงสุดที่เป็นไปได้จากการดึงองค์ประกอบ k ออกจากการรวมกองใดๆ
ดังนั้นหากอินพุตเป็นเหมือน stacks =[[50, -4, -15],[2],[6, 7, 8]], k =4 ผลลัพธ์จะเป็น 39 เนื่องจากเราสามารถเปิดได้ทั้งหมด 3 องค์ประกอบจากสแต็กแรกและเปิดองค์ประกอบสุดท้ายของสแต็กสุดท้ายเพื่อรับ -15 + -4 + 50 + 8 =39
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน rec() นี่จะใช้เวลา i, n
-
ถ้า n เหมือนกับ k แล้ว
-
คืนค่า 0
-
-
ถ้า n> k แล้ว
-
คืนค่าอินฟินิตี้เชิงลบ
-
-
ถ้าฉันเหมือนกับ count of stacks แล้ว
-
คืนค่าอินฟินิตี้เชิงลบ
-
-
ถ้าฉันเหมือนกับการนับกอง - 1 แล้ว
-
จำเป็น :=k - n
-
ถ้าจำเป็น> จำนวนองค์ประกอบของ stacks[i] แล้ว
-
คืนค่าอินฟินิตี้เชิงลบ
-
-
มิฉะนั้น
-
ส่งคืนผลรวมขององค์ประกอบของ stack[i] จำนวนองค์ประกอบที่ต้องการล่าสุด
-
-
-
res :=-math.inf, su :=0
-
สำหรับขนาดช่วงของสแต็ค[i] - 1 ถึง 0,
ลดลง 1 ทำ-
su :=su + stacks[i, sti]
-
localres :=su + rec(i + 1, n + size of stacks[i] - sti)
-
res :=สูงสุดของ res และ localres
-
-
คืนค่าสูงสุดของ res และ rec(i + 1, n)
-
จากเมธอดหลัก เรียก rec(0, 0)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
import math class Solution: def solve(self, stacks, k): def rec(i, n): if n == k: return 0 if n > k: return -math.inf if i == len(stacks): return -math.inf if i == len(stacks) - 1: needed = k - n if needed > len(stacks[i]): return -math.inf else: return sum(stacks[i][-needed:]) res, su = -math.inf, 0 for sti in range(len(stacks[i]) - 1, -1, -1): su += stacks[i][sti] localres = su + rec(i + 1, n + len(stacks[i]) - sti) res = max(res, localres) return max(res, rec(i + 1, n)) return rec(0, 0) ob = Solution() stacks = [ [50, -4, -15], [2], [6, 7, 8] ] k = 4 print(ob.solve(stacks, k))
อินพุต
[[50, -4, -15],[2],[6, 7, 8]], 4
ผลลัพธ์
39