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

C++ में सबसे लंबा बिलबोर्ड

मान लीजिए कि हम एक बिलबोर्ड स्थापित कर रहे हैं और हम चाहते हैं कि इसकी ऊंचाई सबसे अधिक हो। बिलबोर्ड में दोनों तरफ स्टील के दो सपोर्ट होंगे। प्रत्येक समर्थन समान ऊंचाई का होना चाहिए। हमारे पास छड़ का एक संग्रह भी है जिसे एक साथ वेल्ड किया जा सकता है। इसलिए, यदि हमारे पास लंबाई 1, 2, और 3 की छड़ें हैं, तो हम लंबाई 6 का समर्थन करने के लिए उन्हें एक साथ जोड़ सकते हैं। हमें अपने बिलबोर्ड की स्थापना की सबसे बड़ी संभव ऊंचाई का पता लगाना होगा। अगर हम बिलबोर्ड का समर्थन नहीं कर सकते हैं, तो 0 लौटाएं।

इसलिए, यदि इनपुट [1,2,2,3,3,3,4] जैसा है, तो आउटपुट 9 होगा, क्योंकि हमारे पास [1,2,2,4] और [3,3, 3].

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

  • योग:=0, एन:=छड़ का आकार, एन:=2 * 5000

  • एक 2डी सरणी को परिभाषित करें dp(n + 1) x (N + 1, -1)

  • डीपी [0, 5000]:=0

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

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

      • x:=छड़[i]

      • अगर j - x>=0 और dp[i, j - x] -1 के बराबर नहीं है, तो -

        • dp[i + 1, j] =अधिकतम dp[i + 1, j] और dp[i, j - x] + x

      • अगर j + x <=N और dp[i, j + x] -1 के बराबर नहीं है, तो -

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

      • अगर dp[i, j] -1 के बराबर नहीं है, तो

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

  • वापसी डीपी [एन, 5000]

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int tallestBillboard(vector<int>& rods){
      int sum = 0;
      int n = rods.size();
      int N = 2 * 5000;
      vector<vector<int> > dp(n + 1, vector<int>(N + 1, -1));
      dp[0][5000] = 0;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j <= N; j++) {
            int x = rods[i];
            if (j - x >= 0 && dp[i][j - x] != -1) {
               dp[i + 1][j] = max(dp[i + 1][j], dp[i][j - x] +
               x);
            }
            if (j + x <= N && dp[i][j + x] != -1) {
               dp[i + 1][j] = max(dp[i + 1][j], dp[i][j + x]);
            }
            if (dp[i][j] != -1) {
               dp[i + 1][j] = max(dp[i][j], dp[i + 1][j]);
            }
         }
      }
      return dp[n][5000];
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,2,3,3,3,4};
   cout << (ob.tallestBillboard(v));
}

इनपुट

{1,2,2,3,3,3,4}

आउटपुट

9

  1. स्विच स्टेटमेंट C++

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

  1. C++ में मितव्ययी संख्या

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

  1. सी++ पेंटाटोप नंबर

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