#include <iostream>
#include <vector>
using namespace std;
const int INF = -1e9;
int main() {
int n, k, t;
cin >> n >> k >> t;
string schedule;
cin >> schedule;
// DP: dp[i][j][x] - Maksymalna liczba godzin na zadania dla stanu (i, j, x)
vector<vector<vector<int>>> dp(n + 1, vector<vector<int>>(k + 1, vector<int>(3, INF)));
// Bajtazar startuje w domu
dp[0][0][0] = 0;
// Przetwarzanie kolejnych godzin
for (int i = 0; i < n; i++) {
for (int j = 0; j <= k; j++) {
for (int x = 0; x < 3; x++) {
if (dp[i][j][x] == INF) continue; // Nie rozważamy nieosiągalnych stanów
// *** Jeśli jesteśmy w domu (x = 0) ***
if (x == 0) {
// Możemy rozwiązywać zadania (jeśli segment to '3')
if (schedule[i] == '3')
dp[i + 1][j][0] = max(dp[i + 1][j][0], dp[i][j][0] + 1);
else
dp[i + 1][j][0] = max(dp[i + 1][j][0], dp[i][j][0]);
// Jeśli to zdalne spotkanie ('2') i je pomijamy
if (schedule[i] == '2' && j < k)
dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0], dp[i][j][0]);
// Możemy rozpocząć podróż do biura (t godzin)
if (i + t < n)
dp[i + t][j][1] = max(dp[i + t][j][1], dp[i][j][0]);
}
// *** Jeśli jesteśmy w drodze (x = 1) ***
if (x == 1) {
// Nadal w drodze (ale nie możemy robić nic innego)
if (i + t < n)
dp[i + t][j][1] = max(dp[i + t][j][1], dp[i][j][1]);
// Dotarliśmy do biura
if (i + t < n)
dp[i + t][j][2] = max(dp[i + t][j][2], dp[i][j][1]);
}
// *** Jeśli jesteśmy w biurze (x = 2) ***
if (x == 2) {
// Jeśli mamy spotkanie ('1' lub '2'), musimy w nim uczestniczyć
if (schedule[i] == '1' || schedule[i] == '2')
dp[i + 1][j][2] = max(dp[i + 1][j][2], dp[i][j][2]);
// Jeśli pomijamy spotkanie (ale mamy jeszcze limit `k`)
if ((schedule[i] == '1' || schedule[i] == '2') && j < k)
dp[i + 1][j + 1][2] = max(dp[i + 1][j + 1][2], dp[i][j][2]);
// Możemy wrócić do domu (t godzin)
if (i + t < n)
dp[i + t][j][1] = max(dp[i + t][j][1], dp[i][j][2]);
// Możemy rozwiązywać zadania (jeśli segment to '3')
if (schedule[i] == '3')
dp[i + 1][j][2] = max(dp[i + 1][j][2], dp[i][j][2] + 1);
}
}
}
}
// Ostateczna odpowiedź - najlepsza wartość dp[n][j][0]
int result = -1;
for (int j = 0; j <= k; j++) {
result = max(result, dp[n][j][0]);
}
cout << result << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <iostream> #include <vector> using namespace std; const int INF = -1e9; int main() { int n, k, t; cin >> n >> k >> t; string schedule; cin >> schedule; // DP: dp[i][j][x] - Maksymalna liczba godzin na zadania dla stanu (i, j, x) vector<vector<vector<int>>> dp(n + 1, vector<vector<int>>(k + 1, vector<int>(3, INF))); // Bajtazar startuje w domu dp[0][0][0] = 0; // Przetwarzanie kolejnych godzin for (int i = 0; i < n; i++) { for (int j = 0; j <= k; j++) { for (int x = 0; x < 3; x++) { if (dp[i][j][x] == INF) continue; // Nie rozważamy nieosiągalnych stanów // *** Jeśli jesteśmy w domu (x = 0) *** if (x == 0) { // Możemy rozwiązywać zadania (jeśli segment to '3') if (schedule[i] == '3') dp[i + 1][j][0] = max(dp[i + 1][j][0], dp[i][j][0] + 1); else dp[i + 1][j][0] = max(dp[i + 1][j][0], dp[i][j][0]); // Jeśli to zdalne spotkanie ('2') i je pomijamy if (schedule[i] == '2' && j < k) dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0], dp[i][j][0]); // Możemy rozpocząć podróż do biura (t godzin) if (i + t < n) dp[i + t][j][1] = max(dp[i + t][j][1], dp[i][j][0]); } // *** Jeśli jesteśmy w drodze (x = 1) *** if (x == 1) { // Nadal w drodze (ale nie możemy robić nic innego) if (i + t < n) dp[i + t][j][1] = max(dp[i + t][j][1], dp[i][j][1]); // Dotarliśmy do biura if (i + t < n) dp[i + t][j][2] = max(dp[i + t][j][2], dp[i][j][1]); } // *** Jeśli jesteśmy w biurze (x = 2) *** if (x == 2) { // Jeśli mamy spotkanie ('1' lub '2'), musimy w nim uczestniczyć if (schedule[i] == '1' || schedule[i] == '2') dp[i + 1][j][2] = max(dp[i + 1][j][2], dp[i][j][2]); // Jeśli pomijamy spotkanie (ale mamy jeszcze limit `k`) if ((schedule[i] == '1' || schedule[i] == '2') && j < k) dp[i + 1][j + 1][2] = max(dp[i + 1][j + 1][2], dp[i][j][2]); // Możemy wrócić do domu (t godzin) if (i + t < n) dp[i + t][j][1] = max(dp[i + t][j][1], dp[i][j][2]); // Możemy rozwiązywać zadania (jeśli segment to '3') if (schedule[i] == '3') dp[i + 1][j][2] = max(dp[i + 1][j][2], dp[i][j][2] + 1); } } } } // Ostateczna odpowiedź - najlepsza wartość dp[n][j][0] int result = -1; for (int j = 0; j <= k; j++) { result = max(result, dp[n][j][0]); } cout << result << endl; return 0; } |
English