मान लीजिए कि हमारे पास दो पूर्णांक n और k हैं, तो हमें यह पता लगाना होगा कि 1 से n तक की कितनी अलग-अलग सरणियाँ हैं, जैसे कि k व्युत्क्रम जोड़े हैं। व्युत्क्रम जोड़ी सरणी में ith और jth तत्वों के लिए है, यदि i
इसलिए यदि इनपुट n =3 और k =1 जैसा है, तो आउटपुट 2 होगा क्योंकि सरणी [1,3,2] और [2,1,3] में केवल एक उलटा जोड़ा होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक 2D सरणी dp आकार (n + 1) x (k + 1) परिभाषित करें
- dp[0, 0] :=1
- इनिशियलाइज़ i :=1 के लिए, जब i<=n, अपडेट करें (i को 1 से बढ़ाएँ), −
- करें
- dp[i, 0] :=1
- इनिशियलाइज़ j :=1 के लिए, जब j <=k, अपडेट करें (j को 1 से बढ़ाएँ), −
- करें
- dp[i, j] :=dp[i, j-1] + dp[i-1, j]
- dp[i, j] :=dp[i, j] mod m
- यदि j>=i, तो −
- dp[i, j] :=(dp[i, j] - dp[i – 1, j - i] + m) मॉड m
- रिटर्न डीपी[एन, के]
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
const int m = 1e9 + 7;
class Solution {
public:
int kInversePairs(int n, int k) {
vector < vector <int> > dp(n + 1, vector <int>(k + 1));
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
dp[i][0] = 1;
for(int j = 1; j <= k; j++){
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
dp[i][j] %= m;
if(j >= i){
dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + m) % m;
}
}
}
return dp[n][k];
}
};
main(){
Solution ob;
cout << (ob.kInversePairs(4,2));
} इनपुट
4 2
आउटपुट
5