728x90
https://www.acmicpc.net/problem/9184
import sys
def w(a, b, c):
if a <= 0 or b <= 0 or c <= 0: #1
return 1
if a > 20 or b > 20 or c > 20: #2
return w(20, 20, 20)
if dp[a][b][c]: #3
return dp[a][b][c]
if a < b < c:
dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return dp[a][b][c] #4
dp[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 dp[a][b][c] #5
dp = [ [[0]*21 for _ in range(21)] for _ in range(21)] #6
while True:
a, b, c = map(int, sys.stdin.readline().split())
if a == -1 and b == -1 and c == -1: #7
break
print("w(%d, %d, %d) = %d" %(a, b, c, w(a, b, c))) #8
#1, 2 : 범위 1~20을 맞춰주기 위해 조정
#3 : dp 배열을 사용하기 전에 이미 있는 값인지 판단하기위해 #4, 5보다 위에 위치. 이미 존재하는 값이라면 그 값을 그대로 리턴
#4, 5 : 문제의 조건에 맞게 dp로 조정함
#6 : [a][b][c]에 맞게 3차원 리스트 생성, 주어진 함수에서 20을 넘어가면 20으로 조정해주기 때문에 a, b, c범위와 상관없이 21로 조정
#7 : 탈출조건
#8 : 정수랑 함수실행 결과 문자열로 출력
재귀를 dp로 변환하는 문제였다. 개념을 배울 수 있는 문제여서 각 코드마다 왜 이 자리에 위치하는지를 생각해보는 문제였다.
728x90
'[Coding Test] > [백준]' 카테고리의 다른 글
[백준] 9461 파이썬(python) : 파도반 수열 (0) | 2022.07.14 |
---|---|
[백준] 1904 파이썬(python) : 01타일 - dp기초 (0) | 2022.07.14 |
[백준] 24416 파이썬(python) : 알고리즘 수업 - 피보나치 수 1 (0) | 2022.07.13 |
[백준] 1520 파이썬(python) : 내리막 길 - dp+dfs (0) | 2022.07.13 |
[백준] 11053 파이썬(python) : 가장 긴 증가하는 부분 수열 - (★) (0) | 2022.07.13 |