ধরুন আমাদের কাছে সংখ্যা বলা সংখ্যার একটি তালিকা আছে, আমাদেরকে প্রদত্ত সংখ্যার মধ্যে +, −, এবং * এর মতো যেকোনো বাইনারি অপারেটর যোগ করে সর্বাধিক মান খুঁজে বের করতে হবে। যে কোন বৈধ বন্ধনী সন্নিবেশ করান।
সুতরাং, যদি ইনপুটটি 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