๋ฌธ์
https://www.acmicpc.net/problem/9184
๋ด ๋ฌธ์ ํ์ด
memory = [[[0]*21 for _ in range(21)] for __ in range(21)]
def w(a, b, c):
if (a <= 0) | (b <= 0) | (c <= 0):
return 1
if (a > 20) | (b > 20) | (c > 20):
return w(20, 20, 20)
if memory[a][b][c]:
return memory[a][b][c] # ์ด๋ฏธ abc ๊ฐ์ ํด๋นํ๋ memory ์๋ฆฌ์ ๊ฐ์ด ํ ๋น๋์ด ์๋ค๋ฉด(0์ด ์๋๋ผ๋ฉด), ์ฐ์ฐ ํ์ ์์ผ๋ฏ๋ก ๊ทธ๋๋ก memory[a][b][c] ๊ฐ์ ๋ฆฌํด!
if a < b < c:
memory[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return memory[a][b][c]
memory[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
return memory[a][b][c]
while True:
n = list(map(lambda x: int(x), input().split()))
if n == [-1, -1, -1]: break
print(f"w({n[0]}, {n[1]}, {n[2]}) = {w(n[0], n[1], n[2])}")
๐ DP ๋ฌธ์ ๋ก, ์ฃผ์ด์ง ์ฌ๊ทํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ์ฉํ๋ ํจ์จ์ ์ธ ํจ์๋ก ๋ฐ๊ฟ์ฃผ๋๊ฒ ํฌ์ธํธ!
- ๋ฌธ์ ์์ ์ฃผ์ด์ง ํจ์๋ฅผ ๊ฑฐ์ ๋น์ทํ๊ฒ ๊ฐ์ ธ์ค๊ณ , ๊ฑฐ๊ธฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ํด์ฃผ์๋ค.
- a, b, c๊ฐ a < b < c ์กฐ๊ฑด๊ณผ, else์ ํด๋นํ๋ ์กฐ๊ฑด์ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ ์
์ด๋ฏธ memory[a][b][c]์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋์ด์๋ค๋ฉด, ๊ตณ์ด ์ค๋ณต๋ ์ฐ์ฐ์ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก
๊ทธ ๋ค์ ์ฐ์ฐ์ ์คํํ์ง ์๊ณ ๋ฐ๋ก memory[a][b][c]๋ฅผ ๋ฆฌํดํ๊ฒ ํ๋ค. - ๊ทธ๋ฆฌ๊ณ memory[a][b][c]์ ๊ทธ๋ฅ 0์ด ์ ์ฅ๋์ด์๊ณ , ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋์ด์์ง ์์ ์ํ๋ผ๋ฉด
๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ฐ๊ฐ์ ์ฐ์ฐ์ ์คํํ๋ ๋ถ๋ถ์ ๋๊ฐ์ด ๊ตฌํํ๋, ๋ค์์ ์ค๋ณต๋ ์ฐ์ฐ์ ํผํ๊ธฐ ์ํด์
memory[a][b][c]์ ์๋ฆฌ์ ํด๋นํ๋ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋๋ก ํด์ฃผ์๋ค.
๐ก ํผ๋๋ฐฑ
- ์ฒ์์ ์ด๊ฒ ๋ฌด์จ ๋ฌธ์ ์ง,, ์ดํดํ๋๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ๋๋ฐ,,
๋นํจ์จ์ ์ผ๋ก ์ฐ์ฐ์ ์คํํ๋ ํจ์๋ฅผ DP ์๊ณ ๋ฆฌ์ฆ์ ํตํด ํจ์จ์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค๋.,,?
๊ทธ๋ฐ ๋ถ๋ถ์ ๋ณด์ฌ์ฃผ๋ ค๋ ์๋๊ฐ ๋ด๊ธด ๋ฌธ์ ์ธ๋ฏํ๋ค.
'4๏ธโฃ Python > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python Algorithm] ํ๋ฒํ ๋ฐฐ๋ญ BOJ #12865 (2) | 2021.11.25 |
---|---|
[Python Algorithm] ์ซ์์ ํํ Programmers(Lv.2) (0) | 2021.11.22 |
[Python Algorithm] ํ๋๋ฐ ์์ด BOJ #9461 (0) | 2021.11.16 |
[Python Algorithm] 01ํ์ผ BOJ #1904 (0) | 2021.11.16 |
[Python Algorithm] ํผ๋ณด๋์น ํจ์ BOJ #1003 (0) | 2021.11.16 |
๋๊ธ