Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में स्टोन्स को मर्ज करने की न्यूनतम लागत

मान लीजिए कि हमारे पास एक पंक्ति में व्यवस्थित पत्थरों के एन ढेर हैं। यहाँ i-वें ढेर में पत्थर हैं [i] पत्थरों की संख्या। एक चाल में K लगातार ढेर को एक ढेर में विलय करना होता है, अब इस चाल की लागत इन K संख्या के ढेर में पत्थरों की कुल संख्या के बराबर है। हमें पत्थरों के सभी ढेरों को एक ढेर में मिलाने के लिए न्यूनतम लागत का पता लगाना होगा। अगर ऐसा कोई समाधान नहीं है, तो -1 लौटें।

इसलिए, यदि इनपुट [3,2,4,1] और के =2 जैसा है, तो आउटपुट 20 होगा, ऐसा इसलिए है, क्योंकि हम [3, 2, 4, 1] से शुरू करेंगे। फिर हम 5 की लागत पर [3, 2] का विलय करते हैं, और हमारे पास [5, 4, 1] रह जाता है। उसके बाद हम 5 की लागत पर [4, 1] का विलय करते हैं, और हमारे पास [5, 5] रह जाता है। फिर हम 10 की लागत के लिए [5, 5] विलय करते हैं, और हमारे पास [10] रह जाता है। तो, कुल लागत 20 थी, और यह न्यूनतम है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • n :=पत्थरों का आकार

  • अगर (एन -1) मॉड (के -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

    • डीपी [i, जे]:=inf

    • मध्य प्रारंभ करने के लिए:=i, जब मध्य

      • dp[i, j] :=न्यूनतम dp[i, j] और dp[i, mid] + dp[mid + 1, j]

    • अगर (j - i) mod (k - 1) 0 के समान है, तो -

      • dp[i, j] :=dp[i, j] + उपसर्ग[j + 1] - उपसर्ग[i]

  • वापसी डीपी [0, एन -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

  1. C++ में प्रत्येक कार्तीय निर्देशांक को जोड़ने के लिए न्यूनतम लागत ज्ञात करने का कार्यक्रम

    मान लीजिए कि हमारे पास 2D कार्टेशियन निर्देशांक बिंदुओं (x, y) की एक सूची है। हम (x0, y0) और (x1, y1) को जोड़ सकते हैं, जिसकी लागत |x0 - x1| + |y0 - y1|। यदि हमें किसी भी संख्या में बिंदुओं को जोड़ने की अनुमति दी जाती है, तो हमें आवश्यक न्यूनतम लागत का पता लगाना होगा जैसे कि प्रत्येक बिंदु एक पथ से

  1. बोर्ड को C++ में वर्गों में काटने की न्यूनतम लागत

    अवधारणा मान लीजिए कि लंबाई p और चौड़ाई q का एक बोर्ड दिया गया है, हमें इस बोर्ड को p*q वर्गों में तोड़ने की आवश्यकता है ताकि तोड़ने की लागत कम से कम हो। इस बोर्ड के लिए हर किनारे के लिए कटिंग कॉस्ट दी जाएगी। संक्षेप में, हमें काटने के ऐसे क्रम का चयन करने की आवश्यकता है जिससे लागत कम से कम हो। उदाह

  1. C++ में न्यूनतम नाइट मूव्स

    मान लीजिए कि हमारे पास एक अनंत शतरंज की बिसात है जिसमें -infinity से +infinity तक के निर्देशांक हैं, और हमारे पास वर्ग [0, 0] पर एक नाइट है। एक शूरवीर के पास 8 संभावित चालें हैं, जैसा कि नीचे दिखाया गया है। प्रत्येक चाल एक कार्डिनल दिशा में दो वर्ग है, फिर एक वर्ग एक ओर्थोगोनल दिशा में है। हमें न