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

C++ में 3n स्लाइस के साथ पिज़्ज़ा

मान लीजिए कि एक पिज्जा है जिसमें अलग-अलग आकार के 3n स्लाइस हैं, मैं और मेरे दो दोस्त पिज्जा के स्लाइस इस प्रकार लेंगे -

  • मैं कोई भी पिज़्ज़ा स्लाइस चुनूंगा।

  • मेरा दोस्त अमल मेरी पसंद की घड़ी की विपरीत दिशा में अगला टुकड़ा उठाएगा।

  • मेरा दोस्त बिमल मेरी पसंद की अगली स्लाइस को दक्षिणावर्त दिशा में उठाएगा।

  • इन चरणों को तब तक दोहराएं जब तक कि पिज़्ज़ा के और टुकड़े न रह जाएँ।

पिज्जा स्लाइस के आकार को दक्षिणावर्त दिशा में गोलाकार सरणी स्लाइस द्वारा दर्शाया जाता है। हमें स्लाइस आकारों का अधिकतम संभव योग खोजना होगा जो मेरे पास हो सकता है।

तो, अगर इनपुट [9,8,6,1,1,8],

. जैसा है

C++ में 3n स्लाइस के साथ पिज़्ज़ा

तो आउटपुट 16 होगा, जैसा कि प्रत्येक मोड़ में आकार 8 का पिज़्ज़ा स्लाइस चुनें। अगर मैं आकार 9 के साथ स्लाइस चुनता हूं तो मेरे दोस्त आकार 8 के स्लाइस चुनेंगे।

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

एक फ़ंक्शन हल करें () को परिभाषित करें, यह एक सरणी v, और एक तर्क m लेगा,

  • n:=वी का आकार

  • दो 2D सरणियों dp1 और dp2 आकार (n + 1) x (m + 1) प्रत्येक को परिभाषित करें

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • इनिशियलाइज़ j :=0 के लिए, जब j <=m, अपडेट करें (j को 1 से बढ़ाएँ), करें -

      • एक्स:=वी[i]

      • अगर जे <एम, तो -

        • dp2 [i + 1, j + 1] =अधिकतम dp2 [i + 1, j + 1] और dp1 [i, j] + x)

        • dp1[i + 1, j] =अधिकतम dp1[i + 1, j], dp2[i, j] और dp1[i, j]

  • अधिकतम dp1[n, m] और dp2[n, m]

    . लौटाएं
  • मुख्य विधि से निम्न कार्य करें -

  • n :=स्लाइस का आकार

  • रिट:=0

  • ret :=अधिकतम हल (अनुक्रमणिका 1 से अंत तक, n/3) और स्लाइस [0] + हल करें (अनुक्रमणिका 2 से अंत तक के स्लाइस - 1, n/3 - 1)

  • वापसी रिट

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector <int> v, int m){
      int n = v.size();
      vector<vector<int> > dp1(n + 1, vector<int>(m + 1));
      vector<vector<int> > dp2(n + 1, vector<int>(m + 1));
      for (int i = 0; i < n; i++) {
         for (int j = 0; j <= m; j++) {
            int x = v[i];
            if (j < m)
            dp2[i + 1][j + 1] = max(dp2[i + 1][j + 1], dp1[i]
            [j] + x);
            dp1[i + 1][j] = max({ dp1[i + 1][j], dp2[i][j],
            dp1[i][j] });
         }
      }
      return max(dp1[n][m], dp2[n][m]);
   }
   int maxSizeSlices(vector<int>& slices) {
      int n = slices.size();
      int ret = 0;
      ret = max(solve(vector<int>(slices.begin() + 1,
      slices.end()), n / 3), slices[0] + solve(vector<int>(slices.begin() +
      2, slices.end() - 1), n / 3 - 1));
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {9,8,6,1,1,8};
   cout << (ob.maxSizeSlices(v));
}

इनपुट

{9,8,6,1,1,8}

आउटपुट

16

  1. सी ++ में उदाहरण के साथ अभिव्यक्ति वृक्ष

    एक्सप्रेशन ट्री एक विशेष प्रकार का बाइनरी ट्री होता है जिसमें ट्री के प्रत्येक नोड में या तो एक ऑपरेटर या ऑपरेंड होता है। लीफ नोड्स पेड़ का एक संचालन . का प्रतिनिधित्व करता है . गैर-पत्ती नोड्स पेड़ का एक ऑपरेटर . का प्रतिनिधित्व करता है । उदाहरण: इंफिक्स एक्सप्रेशन प्राप्त करने के लिए जिस

  1. C++ में समान योग के साथ स्प्लिट ऐरे

    मान लीजिए कि हमारे पास n पूर्णांकों के साथ एक सरणी है, हमें यह पता लगाना है कि क्या ट्रिपल (i, j, k) हैं जो इन शर्तों का पालन करते हैं - 0

  1. C++ में सबसे अधिक पानी वाला कंटेनर

    हमें कंटेनर की दीवारों की ऊंचाई की एक सरणी दी गई है। लक्ष्य उस कंटेनर को ढूंढना है जिसमें पानी की अधिकतम मात्रा हो सकती है। चूंकि दीवारों की ऊंचाई एक सरणी के तत्व हैं, उनके बीच की दूरी को दो दीवारों के बीच की चौड़ाई के रूप में माना जाता है। उदाहरण के लिए, Arr[i] और Arr[j] की दीवारों के बीच j-i चौड़ा