白準9184ハッピー関数の実行


https://www.acmicpc.net/problem/9184
これはdpの問題ですが、3 D配列をしたことがないので、どうすればいいか検索しました.
https://jainn.tistory.com/82
でも2次元配列を作るように作って次元数を増やしてもいいです
import sys

def w(a, b, c):
    if a <= 0 or b <= 0 or c <= 0:
        return 1
    if a > 20 or b > 20 or c > 20:
        return w(20, 20, 20)
    if dp[a][b][c]: # dp값이 이미 있으면 바로 리턴, 없으면 구하고 리턴
        return dp[a][b][c]
    if a < b and 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]
    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]

dp = [[[0] * 21 for _ in range(21)] for _ in range(21)]
while True:
    a, b, c = map(int, sys.stdin.readline().strip().split())
    if a == b == c == -1:
        break
    print(f'w({a}, {b}, {c}) = {w(a, b, c)}')
これは難しくない問題であるが,見知らぬ3次元配列とifdp[a][b][c]:return dp[a][b][c]とは思わなかった.dpは計算時間を減らすために値を格納するので、再計算は必要ありません.ずっと覚えてね