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

সি++-এ K ইনভার্স পেয়ার অ্যারে


মান লিইয়ে নিই দুটি পূর্ণসংখ্যা n এবং k রয়েছে, আমাদের বের করতে হবে 1 থেকে n পর্যন্ত সংখ্যা দিয়ে কতগুলো ভিন্ন অ্যারে তৈরি করা যায় যাতে ঠিক kটি ইনভার্স পেয়ার থাকে। ইনভার্স পেয়ার বলতে অ্যারেতে i-তম এবং j-তম উপাদানের জন্য, যদি i < j এবং a[i] > a[j] হয়, তবে সেটি একটি ইনভার্স পেয়ার कहলায়। যেহেতু উত্তর খুব বড় হতে পারে, উত্তরটি $10^{9}$ + 7 দিয়ে মডুলো করে দিতে হবে।

সুতরাং যদি ইনপুট হয় n = 3 এবং k = 1, তবে আউটপুট হবে 2 কারণ অ্যারে [1,3,2] এবং [2,1,3]-এ শুধু একটি ইনভার্স পেয়ার রয়েছে।

समाधान पद्धति

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:

  • আকার (n + 1) x (k + 1) এর একটি 2D dp সরণি সংজ্ঞায়িত করুন
  • 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) mod m
  • dp[n, k] ফেরত দিন

उदाहरण

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

#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

  1. সি++-এ অ্যারে অফ ডাবলড পেয়ারস (Array of Doubled Pairs)

  2. C++ ব্যবহার করে অ্যারেতে a % b = k সেটি করার সব জোড়া (a, b) বের করা

  3. C++-এ স্ট্রিং এর অ্যারে (C++ Array of Strings)

  4. C++-এ সর্টিং (Sorting)