কম্পিউটার টিউটোরিয়াল

C++-এ DI সিকোয়েন্সের বৈধ পারমুটেশন গণনা

সমস্যা বিবরণ

'D' (ডিক্রিজিং) এবং 'I' (ইনক্রিজিং) ক্যারেক্টার থেকে বने স্ট্রিং S দেওয়া থাকলে, {0..n} পারমুটেশন P যেখানে S[i]=='D' হলে P[i] > P[i+1] এবং 'I' হলে P[i] < P[i+1] হয় — এমন পারমুটেশনের সংখ্যা বের করতে হবে (মডুলো 10^9+7)।

উদাহরণ

S = "IDD" → আউটপুট = 3 (পারমুটেশন: (0,3,2,1), (1,3,2,0), (2,3,1,0))

সমাধান পদ্ধতি

  • DP[i][j] = প্রথম i ক্যারেক্টার প্রসেস করে শেষে j-তম ছোট nhất সংখ্যা ব্যবহার করা হয়েছে।
  • 'I' হলে পREFIX সাম, 'D' হলে সুফিক্স সাম দিয়ে ট্রানজিশন করা হয়।
  • সময় জটিলতা: O(N²)।

C++ বাস্তবায়ন

#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++ প্রোগ্রাম: সিকোয়েন্সের ওপর নির্দিষ্ট অপারেশন সম্পাদন

  2. C++-এ For লুপ ও While লুপের পার্থক্য

  3. C++-এ ভ্যালিড সুডোকু (Valid Sudoku) চেক করা

  4. উইন্ডোজে C++-এর জন্য সেরা IDE কী? (আলাদা লেখা)