μ΄κ² λ체 μ΄λ»κ² νμ΄μΌ λλ κ±΄μ§ μ νμμ μ°Ύμμ μ΄λ»κ² ν΄μΌλλ건κ°
w(20, 20, 20) λΆν° νλνλ μμΌλ‘ νμ΄μ°λλ° μ무리 μ¬ν΄λ λ체 μ΄λ΄ λ¬Έμ μΌλ¦¬κ° μκ² λ€ μΆμ΄μ ꡬκΈλ§..
νλλ λ©λͺ¨μ΄μ μ΄μ ? μ΄λΌλ κ² λμ€λλ° μΈμμ ko.wikipedia.org/wiki/λ©λͺ¨μ΄μ μ΄μ
μ½κ° νλͺ μ΄μμ λ κΉ¨λν΄μ§λ λλ.?
1. a, b, cλ²μκ° νλλΌλ 0 μ΄νμ΄λ©΄ 1μ λ°ννκ³ νλλΌλ 20 μ΄μμ΄λ©΄ w(20, 20, 20)μ νΈμΆνκΈ° λλ¬Έμ μ΅λ λ²μλ 20
1-1. ww[20][20][20]κΉμ§μ 리μ€νΈλ₯Ό μμ±νλ€
2. a, b, cλ₯Ό μ λ ₯λ°μ μ λ€ -1μ΄λ©΄ whileλ¬Έμ νμΆ
3. w(a, b, c) νΈμΆ
3-1. a, b, c μ λ²μ νμΈ (0 <= a, b, c <= 20)
3-2. ww[a][b][c] κ° νμΈ. 0μ΄ μλλλ§ λ°ν
3-3. a < b < c μ΄λ©΄ w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) λ°ν => μ¬κ·
3-4. μ μ΄λμλ μνμ§ μμΌλ©΄ w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) λ°ν => μ¬κ·
미리 리μ€νΈλ₯Ό μμ±νκ³ κ°μ λ£λλ€..
3-2λ²μ΄ μ§μ§ μ λλ°μ μ΄λ»κ² μ΄λ° μκ°μ γ γ γ γ γ ... λ μμ§ λ©μλ€
# 9184.py
ww = [[[0] * 21 for _ in range(21)] for __ in range(21)]
def w(x, y, z):
if x <= 0 or y <= 0 or z <= 0:
return 1
if x > 20 or y > 20 or z > 20:
return w(20, 20, 20)
if ww[x][y][z]:
return ww[x][y][z]
if x < y < z:
ww[x][y][z] = w(x, y, z-1) + w(x, y-1, z-1) - w(x, y-1, z)
return ww[x][y][z]
ww[x][y][z] = w(x-1, y, z) + w(x-1, y-1, z) + w(x-1, y, z-1) - w(x-1, y-1, z-1)
return ww[x][y][z]
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1:
break
print(f'w({a}, {b}, {c}) = {w(a, b, c)}')
κ·Όλ° λλΌμ΄ μ¬μ€
κ·Έλ₯ μ«μ μΈκ°λ§ μ
λ ₯λ°λκ±°λΌ ν° μ°¨μ΄ μμμ€ μμλλ°
input()ν¨μ μ°λκ±°λ readline()ν¨μ μ°λκ±°λ μ°¨μ΄ μμ²λλ€..
λ¬Όλ‘ readline()μ΄ μ΄λ°° λΉ λ₯΄λ€ γ