어떤 문제에서 다음과 같은 점화식이 주어졌다고 가정한다.
dp[n] = dp[n // p] + dp[n // q] (단, dp[0] = 1)
일반적으로 이를 해결하기 위해 DP 배열을 생성하여 dp[n] 값을 구하는 방식이 사용된다. 하지만 이 문제에서는 n의 범위가 매우 크기 때문에, 단순한 bottom-up 방식으로는 시간 초과 혹은 메모리 초과가 발생할 수 있다.
dp = [1]
for i in range(1, n+1):
dp.append(dp[i//p] + dp[i//q])
print(dp[n])
v1, v2 = n // p, n // q
mv = max(v1, v2)
for i in range(1, mv+1):
dp[i] = dp[i//p] + dp[i//q]
print(dp[v1] + dp[v2])
dp = {0: 1}
def topDown(i):
if i in dp:
return dp[i]
dp[i] = topDown(i//p) + topDown(i//q)
return dp[i]
print(topDown(n))
🔍 깨달은 점