मान लीजिए, हमारे पास एक स्ट्रिंग s और दूसरा मान k है। हमें s के कुछ बाद के क्रमों का चयन करना होगा, ताकि हम k अद्वितीय अनुगामी प्राप्त कर सकें। यहां, बाद के चयन की लागत (ओं) की लंबाई (अनुक्रम) की लंबाई के बराबर होती है। इसलिए, हमें k अद्वितीय अनुक्रमों का चयन करने के बाद संभव न्यूनतम कुल लागत का पता लगाना होगा। यदि हम इस सेट का पता नहीं लगा पाते हैं, तो हम -1 पर लौट आएंगे। हम खाली स्ट्रिंग को एक मान्य बाद के रूप में मानेंगे।
इसलिए, यदि इनपुट s ="pqrs", k =4 जैसा है, तो आउटपुट 3 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=s का आकार
-
एक 2D सरणी dp आकार (n + 1) x (n + 1) परिभाषित करें और इसे 0
से प्रारंभ करें -
एक मानचित्र को अंतिम परिभाषित करें
-
डीपी [0, 0] :=1
-
इनिशियलाइज़ i :=0 के लिए, जब i
-
डीपी [i + 1, 0]:=1
-
इनिशियलाइज़ j :=(i + 1) के लिए, जब j>=1, अपडेट करें (j को 1 से घटाएं), करें -
-
डीपी [i + 1, j]:=dp [i, j] + dp [i, j - 1]
-
-
यदि s[i] अंतिम का अंतिम तत्व नहीं है, तो -
-
इनिशियलाइज़ j :=0 के लिए, जब j <=last[s[i]], अपडेट करें (j को 1 से बढ़ाएँ), करें -
-
डीपी [i + 1, j + 1] - =dp [अंतिम [s[i]], j]
-
-
-
अंतिम [एस [i]]:=मैं
-
-
लागत :=0
-
प्रारंभ करने के लिए i :=n, जब i>=0, अद्यतन करें (i से 1 घटाएं), करें -
-
वैल :=न्यूनतम k और dp[n, i]
-
लागत :=लागत + (वैल * (n - i))
-
के:=के - डीपी [एन, आई]
-
अगर के <=0, तो -
-
लूप से बाहर आएं
-
-
-
अगर के <=0, तो -
-
वापसी लागत
-
-
वापसी -1
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
int solve(string s, int k) {
int n = s.size();
vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
unordered_map<char, int> last;
dp[0][0] = 1;
for (int i = 0; i < n; i++) {
dp[i + 1][0] = 1;
for (int j = (i + 1); j >= 1; j--) {
dp[i + 1][j] = dp[i][j] + dp[i][j - 1];
}
if (last.find(s[i]) != last.end()) {
for (int j = 0; j <= last[s[i]]; j++) {
dp[i + 1][j + 1] -= dp[last[s[i]]][j];
}
}
last[s[i]] = i;
}
int cost = 0;
for (int i = n; i >= 0; i--) {
int val = min(k, dp[n][i]);
cost += (val * (n - i));
k -= dp[n][i];
if (k <= 0) {
break;
}
}
if (k <= 0) {
return cost;
}
return -1;
}
int main(){
cout << solve("pqrs",4) << endl;
return 0;
} इनपुट:
"pqrs", 4
आउटपुट
3