ধরুন আমাদের একটি স্ট্রিং s আছে যা x+y=z ফর্মের একটি সমীকরণ উপস্থাপন করে। আমাদের ন্যূনতম সংখ্যার সংখ্যা খুঁজে বের করতে হবে যা আমাদের s যোগ করতে হবে যাতে সমীকরণটি সত্য হয়।
সুতরাং, ইনপুট যদি s ='2+6=7' এর মত হয়, তাহলে আউটপুট হবে 2।
আমরা "1" এবং "2" সন্নিবেশ করে সমীকরণটিকে "21+6=27" এ পরিণত করতে পারি। তাই মোট সংশোধনের প্রয়োজন 2।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
s কে "+" অক্ষরের উপর ভিত্তি করে ভাগে ভাগ করুন, বাম অংশকে A এ এবং ডান অংশটিকে বিশ্রামে রাখুন
-
বিশ্রামকে "=" অক্ষরের উপর ভিত্তি করে ভাগে ভাগ করুন, বাম অংশকে B এবং ডান অংশকে C
তে রাখুন -
রিটার্ন ডিপি(A - 1 এর আকার, B - 1 এর আকার, C - 1, 0 এর আকার)
-
একটি ফাংশন dp() সংজ্ঞায়িত করুন। এটি i, j, k, বহন করবে
-
যদি i <=-1 এবং j <=-1 এবং k <=-1, তাহলে
-
বহন 0 এর মত হলে 0 ফেরত দিন অন্যথায় 1
-
-
last1 :=(A[i]) যদি i>=0 অন্যথায় 0
-
last2 :=(B[j]) যদি j>=0 অন্যথায় 0
-
last3 :=(C[k]) যদি k>=0 অন্যথায় 0
-
উপসর্গ1 :=(A[সূচী 0 থেকে i + 1]) যদি i>=0 অন্যথায় 0
-
prefix2 :=(B[সূচী ০ থেকে j + 1]) যদি j>=0 অন্যথায় 0
-
উপসর্গ3 :=(C[সূচক 0 থেকে k + 1]) যদি k>=0 অন্যথায় 0
-
যদি i <=-1 এবং j <=-1, তাহলে
-
rhs :=উপসর্গ3 - বহন
-
যদি rhs <=0, তাহলে
-
ফেরত |rhs|
-
-
যদি আমি -1 এর মত হয় বা j -1 এর মত হয়, তাহলে
-
স্ট্রিং rhs
এর রিটার্ন সাইজ
-
-
অন্যথায়,
-
রিটার্ন ফলস
-
-
যদি k <=-1, তাহলে
-
str(prefix1 + prefix2 + বহন)
এর রিটার্ন সাইজ
-
-
উত্তর :=অসীম
-
বহন 2, lhs :=ফেরত ভাগফল এবং অবশিষ্ট ভাগ ( বহন + শেষ 1 + শেষ 2 ) 10
-
যদি lhs শেষ3 এর মত হয়, তাহলে
-
উত্তর :=dp(i - 1, j - 1, k - 1, বহন2)
-
-
req :=last3 - বহন - last2
-
extra_zeros :=সর্বাধিক 0, -1 - i
-
বহন2 :=1 যদি req <0 অন্যথায় 0
-
উত্তর :=সর্বনিম্ন উত্তর, 1 + অতিরিক্ত_শূন্য + dp (সর্বোচ্চ -1, i, j - 1, k - 1, বহন2)
-
req :=last3 - বহন - last1
-
extra_zeros :=সর্বাধিক 0, -1 - j
-
বহন2 :=1 যদি req <0 অন্যথায় 0
-
ans =সর্বনিম্ন (উত্তর, 1 + অতিরিক্ত_শূন্য + dp(i - 1, সর্বোচ্চ(-1, j), k - 1, বহন2))
-
বহন2, lhs :=ফেরত ভাগফল এবং অবশিষ্ট ভাগ (শেষ 1 + শেষ2 + বহন) 10
-
উত্তর :=সর্বনিম্ন উত্তর, 1 + dp(i - 1, j - 1, k, বহন2)
-
উত্তর ফেরত দিন
-
-
মূল পদ্ধতি থেকে রিটার্ন ডিপি (A – 1 এর আকার, B - 1 এর আকার, C - 1, 0 এর আকার)
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
class Solution: def solve(self, s): A, rest = s.split("+") B, C = rest.split("=") def dp(i, j, k, carry): if i <= -1 and j <= -1 and k <= -1: return 0 if carry == 0 else 1 last1 = int(A[i]) if i >= 0 else 0 last2 = int(B[j]) if j >= 0 else 0 last3 = int(C[k]) if k >= 0 else 0 prefix1 = int(A[: i + 1]) if i >= 0 else 0 prefix2 = int(B[: j + 1]) if j >= 0 else 0 prefix3 = int(C[: k + 1]) if k >= 0 else 0 if i <= -1 and j <= -1: rhs = prefix3 - carry if rhs <= 0: return abs(rhs) if i == -1 or j == -1: return len(str(rhs)) else: assert False if k <= -1: return len(str(prefix1 + prefix2 + carry)) ans = float("inf") carry2, lhs = divmod(carry + last1 + last2, 10) if lhs == last3: ans = dp(i - 1, j - 1, k - 1, carry2) req = last3 - carry - last2 extra_zeros = max(0, -1 - i) carry2 = 1 if req < 0 else 0 ans = min(ans, 1 + extra_zeros + dp(max(-1, i), j - 1, k - 1, carry2)) req = last3 - carry - last1 extra_zeros = max(0, -1 - j) carry2 = 1 if req < 0 else 0 ans = min(ans, 1 + extra_zeros + dp(i - 1, max(-1, j), k - 1, carry2)) carry2, lhs = divmod(last1 + last2 + carry, 10) ans = min(ans, 1 + dp(i - 1, j - 1, k, carry2)) return ans return dp(len(A) - 1, len(B) - 1, len(C) - 1, 0) ob = Solution() print (ob.solve('2+6=7'))
ইনপুট
'2+6=7'
আউটপুট
2