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

C++ में प्रतिबंधित सबसीक्वेंस योग


समस्या विवरण

मान लीजिए हमारे पास nums नामक एक सरणी और एक पूर्णांक k है, हमें उस सरणी के एक गैर-खाली सबसीक्वेंस का अधिकतम योग ज्ञात करना है जैसे कि सबसीक्वेंस में हर दो लगातार संख्याओं nums[i] और nums[j] के लिए, जहां i < j, शर्त j - i <= k सत्य है।

जैसा कि हम जानते हैं, एक सरणी का सबसीक्वेंस सरणी से कुछ तत्वों को हटाकर प्राप्त किया जाता है, शेष तत्वों को उनके मूल क्रम में छोड़कर।

उदाहरण

यदि इनपुट है: [10,2,-9,5,19] और k = 2, तो आउटपुट होगा 36 क्योंकि सबसीक्वेंस है [10,2,5,19]।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए निम्नलिखित चरणों का पालन करें (स्लाइडिंग विंडो मैक्सिमम के साथ DP):

  • ret := -inf
  • dp नामक एक सरणी परिभाषित करें और दी गई सरणी को इसमें कॉपी करें
  • एक डीक्यू dq परिभाषित करें
  • v[0] को dq की शुरुआत में डालें
  • n := v का आकार
  • ret := v[0]
  • i := 1 से आरंभ करें, जब i < n, i को 1 से बढ़ाते हुए:
    • यदि i > k और dq का पहला तत्व, dp[i - k - 1] के समान है:
      • dq से फ्रंट तत्व हटाएं
    • dp[i] := dp[i] का अधिकतम और (यदि dq खाली है तो dp[i] + 0, अन्यथा dp[i] + dq का पहला तत्व)
    • जब (dq खाली नहीं है और dq का अंतिम तत्व < dp[i]):
      • dq से अंतिम तत्व हटाएं
    • dp[i] को dq के अंत में डालें
    • ret := ret और dp[i] का अधिकतम
  • ret लौटाएं

C++ कार्यान्वयन

#include <bits/stdc++.h>
using namespace std;

const int inf = 1e9 + 10;

class Solution {
public:
    int constrainedSubsetSum(vector<int>& v, int k) {
        int ret = -inf;
        vector<int> dp(v.begin(), v.end());
        deque<int> dq;
        dq.push_front(v[0]);
        int n = v.size();
        ret = v[0];
        for (int i = 1; i < n; i++) {
            if (i > k && dq.front() == dp[i - k - 1])
                dq.pop_front();
            dp[i] = max(dp[i], dq.empty() ? dp[i] + 0 : dp[i] + dq.front());
            while (!dq.empty() && dq.back() < dp[i])
                dq.pop_back();
            dq.push_back(dp[i]);
            ret = max(ret, dp[i]);
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector<int> v = {10,2,-9,5,19};
    cout << (ob.constrainedSubsetSum(v, 2));
    return 0;
}

इनपुट

{10,2,-9,5,19}, 2

आउटपुट

36
  1. - C++ में मैट्रिक्स ब्लॉक सम

    मान लीजिए हमारे पास एक m * n मैट्रिक्स है जिसे mat कहते हैं और एक इंटीजर K है, हमें एक और मैट्रिक्स answer ढूंढना है जहां प्रत्येक answer[i][j] उन सभी एलिमेंट्स mat[r][c] का योग है जिनके लिए i - K <= r <= i + K, j - K <= c <= j + K, और (r, c) मैट्रिक्स में एक वैध पोजीशन है। यदि इनपुट इस प्रकार है -1

  1. - C++ में Target Sum

    मान लीजिए हमारे पास गैर-ऋणात्मक पूर्णांकों की एक सूची है, a1, a2, ..., an, और एक अन्य मान, जो लक्ष्य (target) है, S। अब हमारे पास 2 प्रतीक + और - हैं। प्रत्येक पूर्णांक के लिए, हमें + और - में से एक को उसके नए प्रतीक के रूप में चुनना चाहिए। हमें यह पता लगाना है कि पूर्णांकों का योग लक्ष्य मान S के स

  1. - C++ में एलिक्वॉट योग (Aliquot Sum)

    यहां हम देखेंगे कि एलिक्वॉट योग क्या है? n का एलिक्वॉट योग n को छोड़कर n के सभी पूर्ण गुणनखंडों का योग है। उदाहरण के लिए, यदि संख्या 20 है, तो पूर्ण गुणनखंड (1, 2, 4, 5, 10) हैं। तो एलिक्वॉट योग 22 है। एक दिलचस्प तथ्य यह है कि, यदि किसी संख्या का एलिक्वॉट योग संख्या स्वयं है, तो वह संख्या एक पूर्ण