#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; } |