আমাদের Nটি স্টোন পাইল একটি রোয়ে সাজানো আছে। i-তম পাইলে stones[i] সংখ্যক স্টোন আছে। একটি মুভ হলো Kটি কনsekutিভ পাইলকে একটা পাইলে মার্জ করা, এই মুভের খরচ হবে এই Kটি পাইলের মোট স্টোন সংখ্যা। আমাদের সব পাইলকে একটা পাইলে মার্জ করার ন্যূনতম খরচ বের করতে হবে। যদি কোনো সমাধান না থাকে, তবে -1 রিটার্ন করুন।
উদাহরণস্বরূপ, ইনপুট nums = [3,2,4,1], K = 2 হলে আউটপুট হবে 20, কারণ:
প্রাথমিক:
[3, 2, 4, 1][3, 2]মার্জ করলে খরচ ৫, থাকে[5, 4, 1][4, 1]মার্জ করলে খরচ ৫, থাকে[5, 5][5, 5]মার্জ করলে খরচ ১০, থাকে[10]মোট খরচ ২০, এবং এটি ন্যূনতম।
সমাধানের ধাপসমূহ (DP)
n := nums-এর আকারযদি
(n-1) % (K-1) != 0হয়, তবে-1রিটার্ন করুনdp := n x nঅ্যারে ০ দিয়ে ফিল করেsums := (n+1)আকারের অ্যারে ০ দিয়ে ফিল করেi= 1 থেকেnপর্যন্ত লুপ চালান:sums[i] := sums[i-1] + nums[i-1]length=Kথেকেnপর্যন্ত লুপ চালান:i= 0 থেকেn-lengthপর্যন্ত লুপ চালান:j := i + length - 1dp[i][j] := infinityt=iথেকেj-1পর্যন্তK-1স্টেপে লুপ চালান:dp[i][j] = min(dp[i][j], dp[i][t] + dp[t+1][j])
যদি
(j-i) % (K-1) == 0হয়, তবে:dp[i][j] += sums[j+1] - sums[i]
dp[0][n-1]রিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝার জন্য:
def solve(nums, K):
n = len(nums)
if (n-1) % (K-1) != 0:
return -1
dp = [[0]*n for _ in range(n)]
sums = [0]*(n+1)
for i in range(1, n+1):
sums[i] = sums[i-1] + nums[i-1]
for length in range(K, n+1):
for i in range(n-length+1):
j = i + length - 1
dp[i][j] = float('inf')
for t in range(i, j, K-1):
dp[i][j] = min(dp[i][j], dp[i][t] + dp[t+1][j])
if (j-i) % (K-1) == 0:
dp[i][j] += sums[j+1] - sums[i]
return dp[0][n-1]
nums = [3,2,4,1]
K = 2
print(solve(nums, K)) ইনপুট
[3,2,4,1], 2
আউটপুট
20