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

पायथन में स्टोन गेम में अधिकतम स्कोर खोजने का कार्यक्रम

मान लीजिए कि एक पंक्ति में कई पत्थर रखे गए हैं, और इनमें से प्रत्येक पत्थर की एक संबद्ध संख्या है, जो एक सरणी स्टोनवैल्यू में दी गई है। अमल प्रत्येक दौर में पंक्ति को दो भागों में विभाजित करता है फिर बिमल प्रत्येक भाग के मूल्य की गणना करता है जो इस भाग के सभी पत्थरों के मूल्यों का योग है। बिमल उस भाग को फेंक देता है जिसका मूल्य अधिकतम होता है, और अमल का अंक शेष भाग के मूल्य से बढ़ जाता है। जब दो भागों के मान समान होते हैं, तो बिमल अमल को तय करने देता है कि कौन सा हिस्सा फेंक दिया जाएगा। अगला दौर शेष भाग से शुरू होता है। खेल समाप्त होता है जब केवल एक पत्थर शेष रहता है। हमें अमल द्वारा प्राप्त किए जा सकने वाले अधिकतम अंक प्राप्त करने होंगे।

इसलिए, यदि इनपुट स्टोनवैल्यू =[7,3,4,5,6,6] जैसा है, तो आउटपुट होगा

  • राउंड 1 पर, अमल पंक्ति को [7,3,4], [5,6,6] की तरह विभाजित करता है। बायीं पंक्ति का योग 14 है और दाहिनी पंक्ति का योग 17 है। बिमल दायीं पंक्ति को फेंक देता है और अमल का स्कोर अब 14 है।

  • राउंड 2 में, अमल पंक्ति को [7], [3,4] में विभाजित करता है। तो बिमल बाईं पंक्ति को फेंक देता है और अमल का स्कोर (14 + 7) =21 हो जाता है।

  • तीसरे दौर में, अमल के पास पंक्ति को विभाजित करने के लिए केवल एक विकल्प है जो [3], [4] है। बिमल दाहिनी पंक्ति को फेंक देता है और अमल का स्कोर अब (21 + 3) =24 है।

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

  • फ़ंक्शन को परिभाषित करें dfs() । यह शुरू होगा, खत्म होगा

  • अगर प्रारंभ>=अंत, तो

    • वापसी 0

  • max_score :=0

  • सीमा में कटौती के लिए प्रारंभ से अंत तक, करें

    • sum1 :=partial_sum[शुरू, कट]

    • sum2 :=partial_sum[cut+1, end]

    • अगर sum1> sum2 , तो

      • स्कोर :=sum2 + dfs(कट+1, अंत)

    • अन्यथा जब sum1

      • स्कोर :=sum1 + dfs (स्टार्ट, कट)

    • अन्यथा,

      • स्कोर :=sum1 + अधिकतम dfs (स्टार्ट, कट) और dfs (कट+1, एंड)

    • max_score :=अधिकतम स्कोर और max_score

  • वापसी max_score

  • एक फ़ंक्शन को परिभाषित करें getPartialSum() । इसमें लगेगा

  • मैं के लिए 0 से n -1 की सीमा में, करो

    • Partial_sum[i, i] :=StoneValue[i]

  • मैं के लिए 0 से n -1 की सीमा में, करो

    • i+1 से n-1 की श्रेणी में j के लिए, करें

      • Partial_sum[i, j] :=partial_sum[i, j-1] + StoneValue[j]

  • मुख्य विधि से, निम्न कार्य करें

  • n :=पत्थर के आकार का मान

  • part_sum :=n x n आकार का एक वर्गाकार सरणी और 0

    . से भरा हुआ
  • getPartialSum ()

  • वापसी dfs(0, n-1)

उदाहरण

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

def solve(stoneValue):
   def dfs(start, end):
      if start >= end:
         return 0
      max_score = 0

      for cut in range(start, end):
         sum1 = partial_sum[start][cut]
         sum2 = partial_sum[cut+1][end]
         if sum1 > sum2:
            score = sum2+dfs(cut+1, end)
         elif sum1 < sum2:
            score = sum1+dfs(start, cut)
         else:
            score = sum1+max(dfs(start, cut), dfs(cut+1, end))
            max_score = max(score, max_score)
      return max_score


   def getPartialSum():
      for i in range(n):
         partial_sum[i][i] = stoneValue[i]
      for i in range(n):
         for j in range(i+1, n):
            partial_sum[i][j] = partial_sum[i][j-1]+stoneValue[j]


   n = len(stoneValue)
   partial_sum = [[0]*n for _ in range(n)]
   getPartialSum()
   return dfs(0, n-1)

stoneValue = [7,3,4,5,6,6]
print(solve(stoneValue))

इनपुट

[7,3,4,5,6,6]

आउटपुट

0

  1. पायथन में अधिकतम भवन ऊंचाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास एक मान n है और जोड़े की एक और सूची है जिसे प्रतिबंध कहा जाता है। हम एक शहर में नई इमारतें बनाना चाहते हैं। लेकिन कुछ प्रतिबंध हैं। हम एक लाइन में बना सकते हैं और इमारतों को 1 से n तक लेबल किया जाता है। प्रतिबंधों के दो पैरामीटर हैं, इसलिए प्रतिबंध [i] =(id_i, max_height_i) इंग

  1. पायथन में उत्पन्न सरणी में अधिकतम खोजने के लिए कार्यक्रम

    मान लीजिए कि हमारे पास एक संख्या n है। हमें निम्नलिखित तरीके से n + 1 लंबाई की एक सरणी A उत्पन्न करनी है - ए[0] =0 ए[1] =1 ए [2 * आई] =ए [i] अगर 2 <=2 * मैं <=n ए [2 * आई + 1] =ए [i] + ए [i + 1] अगर 2 <=2 * i + 1 <=n अंत में हमें सरणी अंकों में अधिकतम संख्या ज्ञात करनी होगी। इसलिए, य

  1. पायथन में संख्याओं को हटाकर अधिकतम योगात्मक अंक प्राप्त करने का कार्यक्रम

    मान लीजिए हमारे पास संख्याओं की एक सूची है जिसे अंक कहा जाता है। आइए एक ऑपरेशन पर विचार करें जहां हम एक संख्या का चयन कर सकते हैं, फिर उसे हटा सकते हैं और संख्या और उसके दो आसन्न संख्याओं के योग से अपना स्कोर बढ़ा सकते हैं। यदि हम इस ऑपरेशन को जितनी बार चाहें उतनी बार कर सकते हैं, जब तक कि हम सूची म