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

C++-এ সঠিক K ত стрел কো сравнения で সর্বোচ্চ মান বের করার জন্য অ্যারে তৈরি


ধরি আমাদের তিনটি পূর্ণসংখ্যা n, m, এবং k আছে। যদি একটি ধনাত্মক পূর্ণসংখ্যার অ্যারের সর্বোচ্চ উপাদান বের করার জন্য নিচের অ্যালগরিদম ব্যবহার করা হয়:

max_val := -1
max_ind := -1
search_cost := 0
n := size of arr
for initialize i := 0, when i < n, update (increase i by 1), do:
    if max_val < arr[i], then:
        max_val := arr[i]
        max_ind := i
        (increase search_cost by 1)
return max_ind

আমাদের এমন একটি অ্যারে arr তৈরি করতে হবে যা নিচের শর্তগুলো পূরণ করে:

  • arr-এ ঠিক n টি পূর্ণসংখ্যা থাকবে।
  • সব arr[i] 1 থেকে m এর মধ্যে থাকবে (0 <= i < n)।
  • উপরোক্ত অ্যালগরিদম arr-এ প্রয়োগ করলে search_cost-এর মান k হবে।
  • এই শর্তগুলো মেনে এমন অ্যারে বানানোর পদ্ধতির সংখ্যা বের করতে হবে। উত্তর বড় হলে 10^9 + 7 দিয়ে মডুলো নেওয়া হবে।

উদাহরণস্বরূপ, যদি ইনপুট হয় n = 2, m = 3, k = 1, তবে আউটপুট হবে 6 কারণ সম্ভব অ্যারেগুলো হল: [1, 1], [2, 1], [2, 2], [3, 1], [3, 2], [3, 3]

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

  • m := 10^9 + 7
  • add() ফাংশন সংজ্ঞায়িত করা: এটি a, b নিবে এবং ((a mod m) + (b mod m)) mod m ফেরত দেবে।
  • আকার 54 x 54 x 105 এর একটি dp অ্যারে সংজ্ঞায়িত করা।
  • help() ফাংশন সংজ্ঞায়িত করা: এটি idx, m, k, currVal, n নিবে।
    • যদি k < 0 হয়, তবে 0 ফেরত দেবে।
    • যদি idx == n + 1 হয়, তবে k == 0 হলে true ফেরত দেবে।
    • যদি dp[idx][k][currVal + 1] != -1 হয়, তবে সেটি ফেরত দেবে।
    • ret := 0
    • i = 1 থেকে m পর্যন্ত লুপ:
      • যদি i > currVal হয়, তবে ret := add(help(idx + 1, m, k - 1, max(currVal, i), n), ret)
      • অন্যথায় ret := add(help(idx + 1, m, k, max(currVal, i), n), ret)
    • dp[idx][k][currVal + 1] = ret ফেরত দেবে।
  • মেইন মেথড থেকে:
    • dp অ্যারেটি -1 দিয়ে ইনিশিয়ালাইজ করা।
    • ret := help(1, m, k, -1, n)
    • ret ফেরত দেবে।

প্রোগ্রাম উদাহরণ

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli m = 1e9 + 7;

class Solution {
public:
    lli add(lli a, lli b) {
        return ((a % m) + (b % m)) % m;
    }
    int dp[54][54][105];
    int help(int idx, int m, int k, int currVal, int n) {
        if (k < 0)
            return 0;
        if (idx == n + 1) {
            return k == 0;
        }
        if (dp[idx][k][currVal + 1] != -1)
            return dp[idx][k][currVal + 1];
        int ret = 0;
        for (int i = 1; i <= m; i++) {
            if (i > currVal) {
                ret = add(help(idx + 1, m, k - 1, max(currVal, i), n), ret);
            } else {
                ret = add(help(idx + 1, m, k, max(currVal, i), n), ret);
            }
        }
        return dp[idx][k][currVal + 1] = ret;
    }
    int numOfArrays(int n, int m, int k) {
        for (int i = 0; i < 54; i++)
            for (int j = 0; j < 54; j++)
                for (int k = 0; k < 105; k++)
                    dp[i][j][k] = -1;
        int ret = help(1, m, k, -1, n);
        return ret;
    }
};

int main() {
    Solution ob;
    cout << (ob.numOfArrays(2, 3, 1));
}

ইনপুট

2, 3, 1

আউটপুট

6
  1. C++-এ দেয়া অ্যারে থেকে সর্বোচ্চ উচ್ಚতার পিরামিড বের করুন

  2. C++-এ STL ব্যবহার করে অ্যারের মিনিমাম ও ম্যাক্সিমাম এলিমেন্ট বের করা

  3. C++-এ STL ব্যবহার করে অ্যারের ম্যাক্সিমাম এলিমেন্ট বের করা

  4. C/C++ বর্তমান স্ট্যান্ডার্ড ডকুমেন্ট কোথায় পাওয়া যায়?