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

DI अनुक्रम के लिए वैध क्रमपरिवर्तन C++ में

मान लीजिए हमारे पास एक स्ट्रिंग S है। यह {'D', 'I'} सेट के वर्णों की एक स्ट्रिंग है। (D का अर्थ "घटता हुआ" और I का अर्थ "बढ़ता हुआ")

अब एक वैध क्रमपरिवर्तन P[0], P[1], ..., P[n] पूर्णांकों {0 से n} का एक क्रमपरिवर्तन है, जैसे कि सभी i के लिए, यह इन नियमों को पूरा करता है:

  • यदि S[i] == 'D', तो P[i] > P[i+1];

  • अन्यथा जब S[i] == 'I', तो P[i] < P[i+1]।

हमें ढूंढना है कि कितने वैध क्रमपरिवर्तन हैं? उत्तर बहुत बड़ा हो सकता है, इसलिए मॉड्यूलो 10^9 + 7 में वापस करें।

उदाहरण के लिए, यदि इनपुट "IDD" है, तो आउटपुट 3 होगा।

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

हम प्रीफिक्स योग अनुकूलन के साथ डायनामिक प्रोग्रामिंग का उपयोग करते हैं:

  • dp[i][j] = पहले i वर्णों के लिए वैध क्रमपरिवर्तनों की संख्या जो j पर समाप्त होती है

  • आधार: dp[0][j] = 1 सभी j के लिए

  • यदि S[i] == 'I': आगे से प्रीफिक्स योग संचित करें

  • यदि S[i] == 'D': पीछे से प्रीफिक्स योग संचित करें

  • उत्तर dp[n][0] है

उदाहरण

#include <bits/stdc++.h> 
using namespace std; 
const int m = 1e9 + 7; 

class Solution { 
public: 
    int numPermsDISequence(string S) { 
        int n = S.size(); 
        vector<vector<int>> dp(n + 1, vector<int>(n + 1)); 
        
        for (int j = 0; j <= n; j++) dp[0][j] = 1; 
        
        for (int i = 0; i < n; i++) { 
            if (S[i] == 'I') { 
                for (int j = 0, curr = 0; j < n - i; j++) { 
                    curr = (dp[i][j] + curr) % m; 
                    dp[i + 1][j] = (dp[i + 1][j] + curr) % m; 
                } 
            } else { 
                for (int j = n - i - 1, curr = 0; j >= 0; j--) { 
                    curr = (dp[i][j + 1] + curr) % m; 
                    dp[i + 1][j] = (dp[i + 1][j] + curr) % m; 
                } 
            } 
        } 
        return dp[n][0]; 
    } 
}; 

int main(){ 
    Solution ob; 
    cout << (ob.numPermsDISequence("IDD")); 
    return 0;
}

इनपुट

"IDD"

आउटपुट

3
  1. - अनुक्रम पर कुछ ऑपरेशन करने का C++ प्रोग्राम

    मान लीजिए एक खाली अनुक्रम और n क्वेरी दी गई हैं जिन्हें प्रोसेस करना है। क्वेरी queries सरणी में दी गई हैं और उनका प्रारूप {query, data} है। क्वेरी तीन प्रकार की हो सकती हैं: query = 1: दिए गए data को अनुक्रम के अंत में जोड़ें। query = 2: अनुक्रम के शुरुआत के तत्व को प्रिंट करें। उसके बाद उस तत्व

  1. - C++ में For बनाम While लूप

    प्रोग्रामिंग में लूप कोड के एक ब्लॉक को कई बार गणना करने के लिए उपयोग किए जाते हैं। यहां हम प्रोग्राम में दो प्रकार के लूप के बीच अंतर देखेंगे, For लूप और While लूप। For लूप For लूप एक प्रकार का पुनरावृत्ति नियंत्रण लूप है जो उपयोगकर्ता को कोड के दिए गए ब्लॉक को एक विशिष्ट संख्या में बार लूप करने की

  1. C++ में वैलिड सुडोकू C++ में वैलिड सुडोकू

    मान लीजिए हमें 9×9 मैट्रिक्स दिया गया है जिसे सुडोकू कहा जाता है। कार्य यह जांचना है कि दिया गया सुडोकू पैटर्न मान्य है या नहीं। सामान्य तौर पर, एक सुडोकू बोर्ड इस तरह दिखता है, सुडोकू के नियम - हर रो में 1-9 की रेंज में एक नंबर होता है हर कॉलम में 1-9 की रेंज में नंबर होते हैं। 3×3 का प्रत्येक ब्