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

C++ में गुब्बारे फोड़ना


मान लीजिए हमारे पास n गुब्बारे हैं, ये 0 से n-1 तक अनुक्रमित हैं। यहां प्रत्येक गुब्बारे पर एक संख्या चित्रित है जिसे nums नामक एक सरणी द्वारा दर्शाया गया है। हमें सभी गुब्बारों को फोड़ना है। यदि हम गुब्बारा i फोड़ते हैं तो हमें nums[i - 1] * nums[i] * nums[i + 1] संख्या के सिक्के मिलेंगे। फोड़ने के बाद, i - 1 और i + 1 फिर से आसन्न हो जाते हैं। हमें गुब्बारों को बुद्धिमानी से फोड़कर एकत्र किए जा सकने वाले अधिकतम सिक्के ढूंढने हैं।

तो यदि इनपुट [3,1,5,7] जैसा है, तो परिणाम 148 होगा। प्रारंभ में सरणी [3,1,5,7] जैसी है, फिर 1 को फोड़ने के बाद, हमें 3 * 1 * 5 = 15 मिलेगा, फिर सरणी [3,5,7] है, फिर 5 फोड़ें, तो हमें (3 * 5 * 7) = 105 मिलेगा, फिर सरणी [3,7] जैसी है, फिर 3 फोड़ें, तो हमें (1*3*7) = 21 मिलेगा, अंत में सरणी [7] है, इसलिए फोड़ने के बाद, हमें 7 मिलेगा, इसलिए कुल 15 + 105 + 21 + 7 = 148 है।

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

  • n := a का आकार

  • यदि (n शून्येतर है) असत्य है, तो,

    • 0 लौटाएं

  • क्रम n x n की एक 2D सरणी dp परिभाषित करें

  • l := n - 1 से आरंभ करें, जब l >= 0, l को 1 से घटाएं करें -

    • r := l से आरंभ करें, जब r < n, r को 1 से बढ़ाएं करें -

      • i := l से आरंभ करें, जब i <= r, i को 1 से बढ़ाएं करें -

        • y := dp[i + 1, r] यदि i + 1 < n, अन्यथा 0

        • z := a[l - 1] यदि l - 1 >= 0 अन्यथा 1

        • w := a[r + 1] यदि r + 1 < n अन्यथा 1

        • x := dp[l, i - 1] यदि i - 1 >= 0, अन्यथा 0 + y + (z * w * a[i])

        • dp[l, r] := dp[l, r] और x का अधिकतम

  • dp[0, n - 1] लौटाएं

उदाहरण

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

#include <bits/stdc++.h> using namespace std; class Solution {    public:    int maxCoins(vector<int>& a) {       int n = a.size();       if(!n)return 0;       vector < vector <int>> dp(n,vector <int> (n));       for(int l = n-1;l>=0;l--){          for(int r=l;r<n;r++){             for(int i =l;i<=r;i++){                dp[l][r] = max(dp[l][r],(i-1>=0?dp[l][i-1]:0) +(i+1<n?dp[i+1][r]:0)+((l-1>=0?a[l-1]:1 )*(r+1<n?a[r+1]:1)*a[i]));             }          }       }       return dp[0][n-1];    } }; main(){    Solution ob;    vector<int> v = {3,1,5,7};    cout << (ob.maxCoins(v)); }

इनपुट

[3,1,5,7]

आउटपुट

148

  1. - C++ में Switch स्टेटमेंट: एक पूर्ण गाइड

    C++ में Switch स्टेटमेंट का उपयोग कैसे करें कंडीशनल स्टेटमेंट्स सभी प्रोग्रामिंग भाषाओं की एक सामान्य विशेषता हैं। इन स्टेटमेंट्स का उपयोग प्रोग्राम के प्रवाह को नियंत्रित करने और यह निर्दिष्ट करने के लिए किया जाता है कि कोड के विशिष्ट ब्लॉक्स कब निष्पादित होने चाहिए। C++ में उपयोग किए जाने वाले मुख

  1. - C++ में मितव्ययी संख्या (Frugal Number)

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया गया है। हमारा कार्य यह जांचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या (FRUGAL NUMBER) − एक संख्या जिसके अंकों की संख्या उस संख्या के अभाज्य गुणनखंडन में अंकों की संख्या से सख्ती से अधिक है। उदाहरण &

  1. C++ में पेंटाटोप संख्या C++ में पेंटाटोप संख्या

    एक पेंटाटोप संख्या को पास्कल के त्रिभुज में पांचवीं संख्या के रूप में वर्णित किया गया है। अब, चूंकि यह पांचवीं संख्या है, इसका मतलब है कि पास्कल के त्रिभुज में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है जो पास्कल के त्रिभुज की चौथी पंक्ति है। तो, इस