मान लीजिए कि हमारे पास तीन पूर्णांक 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
हमें सरणी को एआर बनाना है जिसमें निम्नलिखित मानदंड हैं:एआर में बिल्कुल n पूर्णांक हैं। सभी तत्व गिरफ्तार [i] 1 से मी (सहित) (0 <=i
इसलिए, यदि इनपुट n =2, m =3, k =1 जैसा है, तो आउटपुट 6 होगा क्योंकि संभावित सरणियाँ हैं [1, 1], [2, 1], [2, 2], [3 , 1], [3, 2] [3, 3]
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
मी :=10^9 + 7
फ़ंक्शन ऐड () को परिभाषित करें, इसमें a, b,
वापसी ((एक मॉड एम) + (बी मॉड एम)) मॉड एम
आकार की एक सरणी dp परिभाषित करें:54 x 54 x 105।
फ़ंक्शन सहायता () को परिभाषित करें, यह idx, m, k, currVal, n,
अगर के <0, तो -
वापसी 0
अगर idx n + 1 के समान है, तो -
जब k 0 हो तब सही लौटें
अगर dp[idx, k, currVal + 1] -1 के बराबर नहीं है, तो -
वापसी dp[idx, k, currVal + 1]
रिट:=0
इनिशियलाइज़ करने के लिए i :=1, जब i <=m, अपडेट (i से 1 की वृद्धि), करें -
अगर मैं> 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
मुख्य विधि से निम्न कार्य करें -
इनिशियलाइज़ करने के लिए i:=0, जब i <54, अपडेट करें (1 से बढ़ाएँ), करें -
इनिशियलाइज़ j :=0 के लिए, जब j <54, अपडेट करें (j को 1 से बढ़ाएँ), करें -
k :=0 को इनिशियलाइज़ करने के लिए, जब k <105, अपडेट करें (1 से k बढ़ाएँ), करें -
डीपी [आई, जे, के] :=-1
रिट :=सहायता(1, एम, के, -1, एन)
वापसी रिट
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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;
}
};
main() {
Solution ob;
cout << (ob.numOfArrays(2, 3, 1));
}
इनपुट
2, 3, 1
आउटपुट
6