import sys
def solve():
n, k, t = map(int, sys.stdin.readline().split())
schedule = sys.stdin.readline().strip()
INF = -10**9
dp = [[[-INF] * (k + 1) for _ in range(3)] for _ in range(n + 1)]
dp[0][0][0] = 0 # Start w domu, bez opuszczonych spotkań
for i in range(n):
for missed in range(k + 1):
for loc in range(3):
if dp[i][loc][missed] == INF:
continue
# Opcja 1: Pozostanie w obecnej lokalizacji
if loc == 0: # W domu
dp[i + 1][0][missed] = max(dp[i + 1][0][missed], dp[i][0][missed] + (schedule[i] == '3'))
elif loc == 2: # W biurze
dp[i + 1][2][missed] = max(dp[i + 1][2][missed], dp[i][2][missed])
# Opcja 2: Podróż do biura (jeśli Bajtazar zdąży wrócić)
if loc == 0 and i + t + t <= n:
dp[i + t][1][missed] = max(dp[i + t][1][missed], dp[i][0][missed])
# Opcja 3: Przybycie do biura po podróży
if loc == 1 and i + 1 < n:
dp[i + 1][2][missed] = max(dp[i + 1][2][missed], dp[i][1][missed])
# Opcja 4: Bajtazar może uczestniczyć w spotkaniu biurowym w czasie segmentu (n-t) i wrócić
if loc == 2 and i == n - t:
dp[n][0][missed] = max(dp[n][0][missed], dp[i][2][missed])
# Opcja 5: Powrót do domu (jeśli jest odpowiednio czasu)
if loc == 2 and i + t + t <= n:
dp[i + t][1][missed] = max(dp[i + t][1][missed], dp[i][2][missed])
# Opcja 6: Powrót do domu po podróży
if loc == 1 and i + 1 < n:
dp[i + 1][0][missed] = max(dp[i + 1][0][missed], dp[i][1][missed])
# Opcja 7: Opuszczenie spotkania, jeśli to dozwolone
if (schedule[i] == '1' or schedule[i] == '2') and missed < k:
dp[i + 1][loc][missed + 1] = max(dp[i + 1][loc][missed + 1], dp[i][loc][missed])
result = max(dp[n][0]) # Maksymalna liczba godzin rozwiązywania zadań w domu po poprawnym powrocie
print(-1 if result == INF else result)
if __name__ == "__main__":
solve()
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 | import sys def solve(): n, k, t = map(int, sys.stdin.readline().split()) schedule = sys.stdin.readline().strip() INF = -10**9 dp = [[[-INF] * (k + 1) for _ in range(3)] for _ in range(n + 1)] dp[0][0][0] = 0 # Start w domu, bez opuszczonych spotkań for i in range(n): for missed in range(k + 1): for loc in range(3): if dp[i][loc][missed] == INF: continue # Opcja 1: Pozostanie w obecnej lokalizacji if loc == 0: # W domu dp[i + 1][0][missed] = max(dp[i + 1][0][missed], dp[i][0][missed] + (schedule[i] == '3')) elif loc == 2: # W biurze dp[i + 1][2][missed] = max(dp[i + 1][2][missed], dp[i][2][missed]) # Opcja 2: Podróż do biura (jeśli Bajtazar zdąży wrócić) if loc == 0 and i + t + t <= n: dp[i + t][1][missed] = max(dp[i + t][1][missed], dp[i][0][missed]) # Opcja 3: Przybycie do biura po podróży if loc == 1 and i + 1 < n: dp[i + 1][2][missed] = max(dp[i + 1][2][missed], dp[i][1][missed]) # Opcja 4: Bajtazar może uczestniczyć w spotkaniu biurowym w czasie segmentu (n-t) i wrócić if loc == 2 and i == n - t: dp[n][0][missed] = max(dp[n][0][missed], dp[i][2][missed]) # Opcja 5: Powrót do domu (jeśli jest odpowiednio czasu) if loc == 2 and i + t + t <= n: dp[i + t][1][missed] = max(dp[i + t][1][missed], dp[i][2][missed]) # Opcja 6: Powrót do domu po podróży if loc == 1 and i + 1 < n: dp[i + 1][0][missed] = max(dp[i + 1][0][missed], dp[i][1][missed]) # Opcja 7: Opuszczenie spotkania, jeśli to dozwolone if (schedule[i] == '1' or schedule[i] == '2') and missed < k: dp[i + 1][loc][missed + 1] = max(dp[i + 1][loc][missed + 1], dp[i][loc][missed]) result = max(dp[n][0]) # Maksymalna liczba godzin rozwiązywania zadań w domu po poprawnym powrocie print(-1 if result == INF else result) if __name__ == "__main__": solve() |
English