Giả sử, chúng ta có một chuỗi s và một giá trị khác k. Chúng ta phải chọn một số dãy con của s, để chúng ta có thể nhận được k dãy con duy nhất. Ở đây, chi phí chọn một dãy con bằng độ dài của (các) - độ dài của (dãy con). Vì vậy, chúng ta phải tìm tổng chi phí thấp nhất có thể sau khi chọn k dãy con duy nhất. Nếu chúng tôi không thể tìm ra tập hợp này, chúng tôi sẽ trả về -1. Chúng tôi sẽ coi chuỗi trống là chuỗi con hợp lệ.
Vì vậy, nếu đầu vào là s ="pqrs", k =4, thì đầu ra sẽ là 3.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
n:=kích thước của s
-
Xác định một dp mảng 2D có kích thước (n + 1) x (n + 1) và khởi tạo nó bằng 0
-
Xác định một bản đồ cuối cùng
-
dp [0, 0]:=1
-
để khởi tạo i:=0, khi i
-
dp [i + 1, 0]:=1
-
để khởi tạo j:=(i + 1), khi j> =1, cập nhật (giảm j đi 1), thực hiện -
-
dp [i + 1, j]:=dp [i, j] + dp [i, j - 1]
-
-
nếu s [i] không phải là phần tử cuối của last thì -
-
để khởi tạo j:=0, khi j <=last [s [i]], cập nhật (tăng j lên 1), thực hiện -
-
dp [i + 1, j + 1] - =dp [last [s [i]], j]
-
-
-
[s [i]] cuối cùng:=i
-
-
chi phí:=0
-
để khởi tạo i:=n, khi i> =0, cập nhật (giảm i đi 1), thực hiện -
-
val:=tối thiểu của k và dp [n, i]
-
chi phí:=cost + (val * (n - i))
-
k:=k - dp [n, i]
-
nếu k <=0, thì -
-
Ra khỏi vòng lặp
-
-
-
nếu k <=0, thì -
-
chi phí trả lại
-
-
trả về -1
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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; }
Đầu vào:
"pqrs", 4
Đầu ra
3