ধরুন আমাদের একটি সারিতে সাজানো পাথরের স্তূপ আছে। এখানে i-th স্তূপে পাথর [i] সংখ্যক পাথর রয়েছে। একটি পদক্ষেপে K পরপর পাইলগুলিকে একটি স্তূপে একত্রিত করা হয়, এখন এই পদক্ষেপের খরচ এই K সংখ্যক পাইলের মোট পাথর সংখ্যার সমান। সমস্ত পাথরের স্তূপকে এক স্তূপে একত্রিত করার জন্য আমাদের সর্বনিম্ন খরচ খুঁজে বের করতে হবে। যদি এমন কোন সমাধান না থাকে, তাহলে -1 রিটার্ন করুন।
সুতরাং, যদি ইনপুটটি [3,2,4,1] এবং K =2 এর মত হয়, তাহলে আউটপুট হবে 20, এর কারণ, আমরা [3, 2, 4, 1] দিয়ে শুরু করব। তারপর আমরা 5 খরচের জন্য [3, 2] মার্জ করি, এবং আমাদের [5, 4, 1] বাকি থাকে। এর পরে আমরা 5 খরচের জন্য [4, 1] মার্জ করি, এবং আমাদের [5, 5] বাকি থাকে। তারপর আমরা 10 খরচের জন্য [5, 5] মার্জ করি, এবং আমরা [10] এর সাথে বাকি থাকি। সুতরাং, মোট খরচ ছিল 20, এবং এটি সর্বনিম্ন।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=পাথরের আকার
-
যদি (n - 1) mod (k - 1) 0 এর সমান না হয়, তাহলে −
-
রিটার্ন -1
-
-
আকার n + 1
এর একটি অ্যারে উপসর্গ সংজ্ঞায়িত করুন -
আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −
-
উপসর্গ[i] :=উপসর্গ[i - 1] + পাথর[i - 1]
-
-
n x n
আকারের একটি 2D অ্যারে dp সংজ্ঞায়িত করুন -
শুরুর দৈর্ঘ্যের জন্য :=k, যখন দৈর্ঘ্য <=n, আপডেট করুন (দৈর্ঘ্য 1 দ্বারা বৃদ্ধি করুন), করুন −
-
আরম্ভ করার জন্য i :=0, j :=দৈর্ঘ্য - 1, যখন j
-
dp[i, j] :=inf
-
আরম্ভ করার জন্য mid :=i, যখন mid
-
dp[i, j] :=ন্যূনতম dp[i, j] এবং dp[i, mid] + dp[মধ্য + 1, j]
-
-
যদি (j - i) mod (k - 1) 0 এর মত হয়, তাহলে −
-
dp[i, j] :=dp[i, j] + উপসর্গ[j + 1] - উপসর্গ[i]
-
-
-
dp[0, n - 1]
ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: int mergeStones(vector<int>& stones, int k){ int n = stones.size(); if ((n - 1) % (k - 1) != 0) return -1; vector<int> prefix(n + 1); for (int i = 1; i <= n; i++) { prefix[i] = prefix[i - 1] + stones[i - 1]; } vector<vector<int>> dp(n, vector<int>(n)); for (int length = k; length <= n; length++) { for (int i = 0, j = length - 1; j < n; i++, j++) { dp[i][j] = INT_MAX; for (int mid = i; mid < j; mid += k - 1) { dp[i][j] = min(dp[i][j], dp[i][mid] + dp[mid + 1][j]); } if ((j - i) % (k - 1) == 0) { dp[i][j] += prefix[j + 1] - prefix[i]; } } } return dp[0][n - 1]; } }; main(){ Solution ob; vector<int> v = {3,2,4,1}; cout << (ob.mergeStones(v, 2)); }
ইনপুট
{3,2,4,1}, 2
আউটপুট
20