সমস্যা বিবরণ
'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