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

โปรแกรมเพื่อค้นหาคะแนนสูงสุดจากการลบใน Python


สมมติว่าเราได้รับรายการจำนวนบวก ตอนนี้ เราสามารถลบรายการย่อยที่ต่อเนื่องกันของความยาว t ที่มีค่าเท่ากัน และรับคะแนน t * t เงื่อนไขหนึ่งที่ต้องพิจารณาคือ เราสามารถดำเนินการนี้กี่ครั้งก็ได้จนกว่ารายการจะว่างเปล่า ดังนั้นเราต้องกำหนดจำนวนคะแนนสูงสุดที่เราจะได้รับ

ดังนั้น หากอินพุตเป็น nums =[4, 4, 6, 4, 4] เอาต์พุตจะเป็น 17

สำหรับผลลัพธ์ ก่อนอื่นเราสามารถลบ 6 ซึ่งมีความยาว 1 และให้ผลลัพธ์ 1 * 1 =1 จุด จากนั้นเราสามารถเอารายการ [4, 4, 4, 4] ซึ่งมีความยาว 4 และให้ผล 4 * 4 =16 คะแนน ในที่สุด เราก็ได้ 17 แต้ม

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน dp() นี่จะเป็นทางซ้าย ขวา t

  • ถ้า left> right ไม่ใช่ศูนย์ ดังนั้น

    • คืนค่า 0

  • num :=nums[ซ้าย]

  • left2 :=ซ้าย

  • ในขณะที่ left2

    • left2 :=left2 + 1

  • t :=t + left2 − left + 1

  • ซ้าย :=left2 + 1

  • คะแนน :=t ยกกำลัง 2 + dp(ซ้าย, ขวา, 0)

  • สำหรับช่วงกลางจากซ้ายไปขวา + 1 ทำ

    • ถ้า nums[mid] เท่ากับ num แล้ว

      • คะแนน :=สูงสุดของ (จุด, dp(ซ้าย, กลาง − 1, 0) + dp(กลาง, ขวา, t))

  • จุดกลับ

  • จากหน้าที่หลัก เราทำสิ่งต่อไปนี้ -

  • พิมพ์(dp(0, ขนาดของ nums − 1, 0))

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class Solution:
   def solve(self, nums):
      def dp(left, right, t):
         if left > right:
            return 0
         num = nums[left]
         left2 = left
         while left2 < right and nums[left2 + 1] == num:
            left2 += 1
         t += left2 − left + 1
            left = left2 + 1
         points = t ** 2 + dp(left, right, 0)
         for mid in range(left, right + 1):
            if nums[mid] == num:
               points = max(points, dp(left, mid − 1, 0) + dp(mid, right, t))
            return points
         return dp(0, len(nums) − 1, 0)
ob1 = Solution()
print(ob1.solve([4, 4, 6, 4, 4]))

อินพุต

[4, 4, 6, 4, 4]

ผลลัพธ์

17