Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาผลรวมสูงสุดของสองรายการย่อยที่ไม่ทับซ้อนกันใน Python


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า 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