Giả sử chúng ta có một danh sách các số được gọi là num, chúng ta phải tìm giá trị lớn nhất có thể được tạo ra bằng cách thêm bất kỳ toán tử nhị phân nào như +, -, và * vào giữa các số đã cho như chèn bất kỳ dấu ngoặc hợp lệ nào.
Vì vậy, nếu đầu vào là nums =[−6, −4, −10], thì đầu ra sẽ là 100, vì chúng ta có thể tạo biểu thức như:((−6) + (−4)) * −10.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
OPS:=danh sách các toán tử [+, -, *]
-
N:=kích thước của A
-
nếu tất cả các phần tử trong A bằng 0 thì
-
trả về 0
-
-
Định nghĩa một hàm dp (). Điều này sẽ mất tôi, j
-
nếu tôi giống với j, thì
-
trả về một cặp (A [i], A [i])
-
-
thấp:=inf, cao:=−inf
-
đối với k trong phạm vi i đến j - 1, thực hiện
-
đối với mỗi bên trái trong dp (i, k), thực hiện
-
đối với mỗi quyền trong dp (k + 1, j), thực hiện
-
đối với mỗi nhà điều hành chọn tham gia OPS, hãy thực hiện
-
res:=left op right
-
nếu res
-
thấp:=res
nếu res> cao thì
-
cao:=res
trả về cặp (thấp, cao)
Từ phương thức chính, hãy làm như sau -
ans:=dp (0, N - 1)
trả về giá trị thứ hai của ans
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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))
Đầu vào
[−6, −4, −10]
Đầu ra
100
-
-
-
-
-