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

पायथन में पत्थरों को मिलाने के लिए न्यूनतम लागत खोजने का कार्यक्रम

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

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

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

  • n :=अंकों का आकार

  • अगर (n-1) मॉड (K-1) 0 नहीं है, तो

    • वापसी -1

  • dp :=एक n x n सरणी और 0 से भरें

  • sums :=n आकार की सरणी (n+1) और 0 से भरें

  • 1 से n की सीमा में i के लिए, करें

    • रकम [i] :=रकम [i-1]+nums[i-1]

  • K से n तक की लंबाई के लिए, करें

    • मेरे लिए 0 से n-लंबाई की सीमा में, करें

      • जे:=मैं+लंबाई-1

      • डीपी [i, जे]:=अनंत

      • t श्रेणी में i से j-1 के लिए, K-1 द्वारा प्रत्येक चरण में अपडेट करें, करें

        • dp[i][j] =न्यूनतम dp[i, j] और (dp[i, t] + dp[t+1, j])

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

        • dp[i, j] :=dp[i, j] + sums[j+1]-sums[i]

  • वापसी डीपी [0, एन -1]

उदाहरण

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें

import heapq
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

  1. पायथन में एक छड़ी काटने के लिए न्यूनतम लागत खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास एक मान n और एक सरणी है जिसे कट कहा जाता है। मान लीजिए कि लंबाई n इकाइयों की लकड़ी की छड़ी है। छड़ी को 0 से n तक लेबल किया गया है। यहां कटौती [i] उस स्थिति का प्रतिनिधित्व करती है जहां हम कटौती कर सकते हैं। हमें कटौती क्रम में करनी चाहिए, लेकिन हम कटौती के क्रम को अपनी इच्छानुस

  1. पायथन में घरों की पेंटिंग के लिए न्यूनतम लागत खोजने का कार्यक्रम

    मान लीजिए कि आकार m की एक सरणी है, एक छोटे से शहर में m घरों का प्रतिनिधित्व करता है, प्रत्येक घर को n रंगों में से एक के साथ चित्रित किया जाना चाहिए (रंगों को 1 से n तक लेबल किया गया है), और कुछ घर पहले से ही चित्रित हैं, इसलिए कोई आवश्यकता नहीं है फिर से पेंट करें। वे घर जो एक ही रंग से रंगे होते

  1. पायथन में सभी बिंदुओं को जोड़ने के लिए न्यूनतम लागत खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास बिंदु (x, y) के रूप में कुछ बिंदुओं के साथ बिंदु नामक एक सरणी है। अब दो बिंदुओं (xi, yi) और (xj, yj) को जोड़ने की लागत उनके बीच मैनहट्टन दूरी है, सूत्र है |xi - xj| + |yi - yj|। हमें सभी बिंदुओं को जोड़ने के लिए न्यूनतम लागत का पता लगाना होगा। इसलिए, यदि इनपुट पॉइंट्स की तरह