def fits_at(r, c, height, width, N, M, field):
if r + height > N or c + width > M:
return False
for row in range(r, r + height):
for col in range(c, c + width):
if field[row][col] == 1:
return False
return True
# 0KXRgNGW0L/Rg9C90L7Qsg==
def dp_solve(index, N, M, P, K, field, memo):
if index >= N * M:
return 0
if memo[index] != -1:
return memo[index]
r = index // M
c = index % M
max_garages = dp_solve(index + 1, N, M, P, K, field, memo)
if fits_at(r, c, P, K, N, M, field):
next_c = c + K
next_r = r + (next_c // M)
next_index = next_r * M + (next_c % M)
garages_if_placed = 1 + dp_solve(next_index, N, M, P, K, field, memo)
max_garages = max(max_garages, garages_if_placed)
memo[index] = max_garages
return max_garages
def find_max_garages(N, M, P, K, field):
memo_pk = [-1] * (N * M + 1)
result_pk = dp_solve(0, N, M, P, K, field, memo_pk)
final_result = result_pk
if P != K:
memo_kp = [-1] * (N * M + 1)
result_kp = dp_solve(0, N, M, K, P, field, memo_kp)
final_result = max(result_pk, result_kp)
return final_result
def solve():
try:
line1 = input("Введіть розміри поля N M (наприклад, 8 8): ").split()
if len(line1) < 2:
raise ValueError("Потрібно ввести два числа: N та M.")
N = int(line1[0])
M = int(line1[1])
line2 = input("Введіть розміри гаража P K (наприклад, 2 3): ").split()
if len(line2) < 2:
raise ValueError("Потрібно ввести два числа: P та K.")
P = int(line2[0])
K = int(line2[1])
print(f"Введіть поле {N}x{M}, де '1' - дерево, '0' - вільна ділянка. Кожен рядок - через пробіл:")
field = []
for i in range(N):
row_input = input(f"Рядок {i}: ").split()
if len(row_input) != M:
print(f"Помилка: Рядок {i} повинен містити {M} елементів.")
return
field.append([int(x) for x in row_input])
except Exception as e:
print(f"Помилка вводу: {e}")
return
if N > 50 or M > 50:
print("Помилка: N та M не повинні перевищувати 50.")
return
max_garages = find_max_garages(N, M, P, K, field)
print(f"\nМаксимальна кількість прямокутних гаражів ({P}x{K} або {K}x{P}), які можна розмістити: {max_garages}")
solve()
ZGVmIGZpdHNfYXQociwgYywgaGVpZ2h0LCB3aWR0aCwgTiwgTSwgZmllbGQpOgoKICAgIGlmIHIgKyBoZWlnaHQgPiBOIG9yIGMgKyB3aWR0aCA+IE06CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZm9yIHJvdyBpbiByYW5nZShyLCByICsgaGVpZ2h0KToKICAgICAgICBmb3IgY29sIGluIHJhbmdlKGMsIGMgKyB3aWR0aCk6CiAgICAgICAgICAgIGlmIGZpZWxkW3Jvd11bY29sXSA9PSAxOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQogICAgCiMgMEtYUmdOR1cwTC9SZzlDOTBMN1FzZz09CgpkZWYgZHBfc29sdmUoaW5kZXgsIE4sIE0sIFAsIEssIGZpZWxkLCBtZW1vKToKICAgIGlmIGluZGV4ID49IE4gKiBNOgogICAgICAgIHJldHVybiAwCgogICAgaWYgbWVtb1tpbmRleF0gIT0gLTE6CiAgICAgICAgcmV0dXJuIG1lbW9baW5kZXhdCgogICAgciA9IGluZGV4IC8vIE0KICAgIGMgPSBpbmRleCAlIE0KCiAgICBtYXhfZ2FyYWdlcyA9IGRwX3NvbHZlKGluZGV4ICsgMSwgTiwgTSwgUCwgSywgZmllbGQsIG1lbW8pCgogICAgaWYgZml0c19hdChyLCBjLCBQLCBLLCBOLCBNLCBmaWVsZCk6CiAgICAgICAgbmV4dF9jID0gYyArIEsKICAgICAgICBuZXh0X3IgPSByICsgKG5leHRfYyAvLyBNKQoKICAgICAgICBuZXh0X2luZGV4ID0gbmV4dF9yICogTSArIChuZXh0X2MgJSBNKQoKICAgICAgICBnYXJhZ2VzX2lmX3BsYWNlZCA9IDEgKyBkcF9zb2x2ZShuZXh0X2luZGV4LCBOLCBNLCBQLCBLLCBmaWVsZCwgbWVtbykKICAgICAgICBtYXhfZ2FyYWdlcyA9IG1heChtYXhfZ2FyYWdlcywgZ2FyYWdlc19pZl9wbGFjZWQpCgogICAgbWVtb1tpbmRleF0gPSBtYXhfZ2FyYWdlcwogICAgcmV0dXJuIG1heF9nYXJhZ2VzCgoKZGVmIGZpbmRfbWF4X2dhcmFnZXMoTiwgTSwgUCwgSywgZmllbGQpOgoKICAgIG1lbW9fcGsgPSBbLTFdICogKE4gKiBNICsgMSkKICAgIHJlc3VsdF9wayA9IGRwX3NvbHZlKDAsIE4sIE0sIFAsIEssIGZpZWxkLCBtZW1vX3BrKQoKICAgIGZpbmFsX3Jlc3VsdCA9IHJlc3VsdF9wawoKICAgIGlmIFAgIT0gSzoKICAgICAgICBtZW1vX2twID0gWy0xXSAqIChOICogTSArIDEpCiAgICAgICAgcmVzdWx0X2twID0gZHBfc29sdmUoMCwgTiwgTSwgSywgUCwgZmllbGQsIG1lbW9fa3ApCgogICAgICAgIGZpbmFsX3Jlc3VsdCA9IG1heChyZXN1bHRfcGssIHJlc3VsdF9rcCkKCiAgICByZXR1cm4gZmluYWxfcmVzdWx0CgoKZGVmIHNvbHZlKCk6CiAgICB0cnk6CiAgICAgICAgbGluZTEgPSBpbnB1dCgi0JLQstC10LTRltGC0Ywg0YDQvtC30LzRltGA0Lgg0L/QvtC70Y8gTiBNICjQvdCw0L/RgNC40LrQu9Cw0LQsIDggOCk6ICIpLnNwbGl0KCkKICAgICAgICBpZiBsZW4obGluZTEpIDwgMjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi0J/QvtGC0YDRltCx0L3QviDQstCy0LXRgdGC0Lgg0LTQstCwINGH0LjRgdC70LA6IE4g0YLQsCBNLiIpCiAgICAgICAgTiA9IGludChsaW5lMVswXSkKICAgICAgICBNID0gaW50KGxpbmUxWzFdKQoKICAgICAgICBsaW5lMiA9IGlucHV0KCLQktCy0LXQtNGW0YLRjCDRgNC+0LfQvNGW0YDQuCDQs9Cw0YDQsNC20LAgUCBLICjQvdCw0L/RgNC40LrQu9Cw0LQsIDIgMyk6ICIpLnNwbGl0KCkKICAgICAgICBpZiBsZW4obGluZTIpIDwgMjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi0J/QvtGC0YDRltCx0L3QviDQstCy0LXRgdGC0Lgg0LTQstCwINGH0LjRgdC70LA6IFAg0YLQsCBLLiIpCiAgICAgICAgUCA9IGludChsaW5lMlswXSkKICAgICAgICBLID0gaW50KGxpbmUyWzFdKQoKICAgICAgICBwcmludChmItCS0LLQtdC00ZbRgtGMINC/0L7Qu9C1IHtOfXh7TX0sINC00LUgJzEnIC0g0LTQtdGA0LXQstC+LCAnMCcgLSDQstGW0LvRjNC90LAg0LTRltC70Y/QvdC60LAuINCa0L7QttC10L0g0YDRj9C00L7QuiAtINGH0LXRgNC10Lcg0L/RgNC+0LHRltC7OiIpCiAgICAgICAgZmllbGQgPSBbXQogICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgogICAgICAgICAgICByb3dfaW5wdXQgPSBpbnB1dChmItCg0Y/QtNC+0Loge2l9OiAiKS5zcGxpdCgpCiAgICAgICAgICAgIGlmIGxlbihyb3dfaW5wdXQpICE9IE06CiAgICAgICAgICAgICAgICBwcmludChmItCf0L7QvNC40LvQutCwOiDQoNGP0LTQvtC6IHtpfSDQv9C+0LLQuNC90LXQvSDQvNGW0YHRgtC40YLQuCB7TX0g0LXQu9C10LzQtdC90YLRltCyLiIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZmllbGQuYXBwZW5kKFtpbnQoeCkgZm9yIHggaW4gcm93X2lucHV0XSkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiLQn9C+0LzQuNC70LrQsCDQstCy0L7QtNGDOiB7ZX0iKQogICAgICAgIHJldHVybgoKICAgIGlmIE4gPiA1MCBvciBNID4gNTA6CiAgICAgICAgcHJpbnQoItCf0L7QvNC40LvQutCwOiBOINGC0LAgTSDQvdC1INC/0L7QstC40L3QvdGWINC/0LXRgNC10LLQuNGJ0YPQstCw0YLQuCA1MC4iKQogICAgICAgIHJldHVybgoKICAgIG1heF9nYXJhZ2VzID0gZmluZF9tYXhfZ2FyYWdlcyhOLCBNLCBQLCBLLCBmaWVsZCkKCiAgICBwcmludChmIlxu0JzQsNC60YHQuNC80LDQu9GM0L3QsCDQutGW0LvRjNC60ZbRgdGC0Ywg0L/RgNGP0LzQvtC60YPRgtC90LjRhSDQs9Cw0YDQsNC20ZbQsiAoe1B9eHtLfSDQsNCx0L4ge0t9eHtQfSksINGP0LrRliDQvNC+0LbQvdCwINGA0L7Qt9C80ZbRgdGC0LjRgtC4OiB7bWF4X2dhcmFnZXN9IikKCnNvbHZlKCkK