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

সি++-এ K ইনভার্স পেয়ার অ্যারে (K Inverse Pairs Array)

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

যেমন, n = 3, k = 1 হলে, আউটপুট ২। অ্যারেগুলো [1,3,2] এবং [2,1,3]।

সমাধানের ধাপসমূহ

  • (n+1) x (k+1) আকারের ২D dp অ্যারে সংজ্ঞায়িত করুন
  • dp[0][0] := 1
  • i := 1 থেকে n পর্যন্ত:
    • dp[i][0] := 1
    • j := 1 থেকে k পর্যন্ত:
      • dp[i][j] := dp[i][j-1] + dp[i-1][j]
      • dp[i][j] %= m
      • যদি j >= i হয়, dp[i][j] := (dp[i][j] - dp[i-1][j-i] + m) % 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. C++-এ আইসোমরফিক ট্রি (Isomorphic Tree) চেক করা

  2. বাইনারি ট্রিতে এক রো নোড যোগ করা C++-এ

  3. বাইনারি ট্রির বাউন্ডারি ট্রাভার্সাল C++-এ

  4. সর্বোচ্চ বাইনারি ট্রি নির্মাণ C++-এ