ধরুন আমাদের কাছে সংখ্যা বলা সংখ্যার একটি তালিকা আছে, আমাদেরকে প্রদত্ত সংখ্যার মধ্যে +, −, এবং * এর মতো যেকোনো বাইনারি অপারেটর যোগ করে সর্বাধিক মান খুঁজে বের করতে হবে। যে কোন বৈধ বন্ধনী সন্নিবেশ করান।
সুতরাং, যদি ইনপুটটি nums =[−6, −4, −10] এর মত হয়, তাহলে আউটপুট হবে 100, যেমন আমরা এক্সপ্রেশন তৈরি করতে পারি:((−6) + (−4)) * −10।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
OPS :=অপারেটরদের একটি তালিকা [+, −,]
-
N :=A
এর আকার -
যদি A-এর সমস্ত উপাদান 0 হয়, তাহলে
-
রিটার্ন 0
-
-
একটি ফাংশন dp() সংজ্ঞায়িত করুন। এটি i, j
লাগবে -
যদি আমি j এর মত হয়, তাহলে
-
একটি জোড়া ফেরত দিন (A[i], A[i])
-
-
low :=inf, high :=−inf
-
k এর জন্য i থেকে j − 1, do
-
প্রতিটি বামে dp(i, k), do
-
dp(k + 1, j) প্রতিটি ডানের জন্য, করুন
-
OPS-এ প্রতিটি অপারেটরের জন্য, করুন
-
res :=বাম ও ডান
-
যদি রেস <কম, তাহলে
-
কম :=রেস
-
-
যদি রেস> উচ্চ হয়, তাহলে
-
উচ্চ :=রেস
-
-
-
-
-
-
রিটার্ন পেয়ার (নিম্ন, উচ্চ)
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
উত্তর :=dp(0, N − 1)
-
উত্তরের দ্বিতীয় মান ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
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