สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums เราต้องหาค่าสูงสุดที่สามารถสร้างได้โดยการเพิ่มตัวดำเนินการไบนารีใดๆ เช่น +, − และ * ระหว่างตัวเลขที่กำหนดด้วย เช่นใส่วงเล็บที่ถูกต้อง
ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[−6, −4, -10] ผลลัพธ์จะเป็น 100 เนื่องจากเราสามารถสร้างนิพจน์ได้ เช่น ((−6) + (−4)) * −10
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
OPS :=รายการตัวดำเนินการ [+, −, *]
-
N :=ขนาด A
-
ถ้าองค์ประกอบทั้งหมดใน A เป็น 0 แล้ว
-
คืนค่า 0
-
-
กำหนดฟังก์ชัน dp() นี่จะใช้เวลา i, j
-
ถ้าฉันเหมือนกับ j แล้ว
-
ส่งคืนคู่ (A[i], A[i])
-
-
ต่ำ :=inf, สูง :=−inf
-
สำหรับ k ในช่วง i ถึง j − 1 ทำ
-
สำหรับแต่ละที่เหลือใน dp(i, k) ทำ
-
สำหรับแต่ละสิทธิ์ใน dp(k + 1, j) ทำ
-
สำหรับโอเปอเรเตอร์แต่ละตัวใน OPS ให้ทำ
-
res :=ซ้าย op ขวา
-
ถ้า res <ต่ำ แล้ว
-
ต่ำ :=res
-
-
ถ้า res> สูง ก็
-
สูง :=ความละเอียด
-
-
-
-
-
-
คู่กลับ (ต่ำ สูง)
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
ตอบ :=dp(0, N - 1)
-
ส่งคืนค่าที่สองของ ans
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
import operator
class Solution:
def solve(self, A):
OPS = [operator.add, operator.sub, operator.mul]
N = len(A)
if not any(A):
return 0
def dp(i, j):
if i == j:
return [A[i], A[i]]
low = float("inf")
high = float("−inf")
for k in range(i, j):
for left in dp(i, k):
for right in dp(k + 1, j):
for op in OPS:
res = op(left, right)
if res < low:
low = res
if res > high:
high = res
return [low, high]
return dp(0, N − 1)[1]
ob = Solution()
nums = [−6, −4, −10]
print(ob.solve(nums)) อินพุต
[−6, −4, −10]
ผลลัพธ์
100