λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“Š Algorithm/BOJ

βœ… BOJ 17070 - 3차원 DP

by huis_log 2025. 7. 3.

μ‹œμž‘ μƒνƒœ

처음 νŒŒμ΄ν”„λŠ” (0,0)~(0,1)에 κ°€λ‘œλ‘œ 놓여 μžˆλ‹€. μ‹œμž‘μ€ κ°€λ‘œλ‹€. κ·Έλž˜μ„œ dp[0][1][κ°€λ‘œ] = 1둜 μž‘λŠ”λ‹€.

DP λ°°μ—΄ 의미

dp[y][x][dir]λŠ” (y,x)에 dir λ°©ν–₯으둜 λ„μ°©ν•˜λŠ” 경우의 μˆ˜λ‹€.
dir은 0이 κ°€λ‘œ, 1이 μ„Έλ‘œ, 2κ°€ λŒ€κ°μ„ .

이동 κ·œμΉ™

κ°€λ‘œλ‘œ 였면 κ°€λ‘œλ‚˜ λŒ€κ°μ„  갈 수 있음.
μ„Έλ‘œλ‘œ 였면 μ„Έλ‘œλ‚˜ λŒ€κ°μ„ λ§Œ κ°€λŠ₯.
λŒ€κ°μ„ μœΌλ‘œ 였면 κ°€λ‘œ, μ„Έλ‘œ, λŒ€κ°μ„  μ „λΆ€ κ°€λŠ₯.

이동 쑰건

κ°€λ‘œ 이동은 였λ₯Έμͺ½λ§Œ λ²½ μ•„λ‹ˆλ©΄ 됨.
μ„Έλ‘œ 이동은 μ•„λž˜λ§Œ λ²½ μ•„λ‹ˆλ©΄ 됨.
λŒ€κ°μ„ μ€ 였λ₯Έμͺ½, μ•„λž˜, λŒ€κ°μ„  λ°©ν–₯ μ „λΆ€ λ²½ μ•„λ‹ˆμ–΄μ•Ό 함.

흐름

μƒνƒœ λŒλ©΄μ„œ ν˜„μž¬ μΉΈ 값이 0이면 κ±΄λ„ˆλœ€. κ°’ 있으면 갈 수 μžˆλŠ” λ‹€μŒ 칸에 λ”ν•΄μ€Œ.

μ’…λ£Œ 쑰건

dp[n-1][n-1]에 λͺ¨μΈ κ°€λ‘œ, μ„Έλ‘œ, λŒ€κ°μ„  μ „λΆ€ λ”ν•΄μ„œ 좜λ ₯.

핡심

이런 DPλŠ” μ–΄λ””μ„œ μ™”λŠ”μ§€ λ”°μ§ˆ ν•„μš” μ—†μŒ. μ§€κΈˆκΉŒμ§€ 온 κ°’λ§Œ 있으면 끝. λ°°μ—΄ λ§Œλ“€κ³  λŒλ©΄μ„œ λ‹€μŒμœΌλ‘œ λ„˜κΈ°λ©΄ 됨. 끝.

 

# dp
import sys
input=sys.stdin.readline
n=int(input())
graph=[list(map(int,input().split())) for _ in range(n)]
dp=[[[0]*3 for _ in range(n)] for _ in range(n)]
dp[0][1][0]=1
# dir=0,1,2(κ°€λ‘œ,μ„Έλ‘œ,λŒ€κ°μ„ )
for y in range(n):
    for x in range(n):
        for dir in range(3):
            if dp[y][x][dir]==0:
                continue
            #κ°€λ‘œλ‘œ 온 경우
            if dir==0 or dir==2:
                #κ°€λ‘œ 이동이 κ°€λŠ₯ν•˜λ©΄
                if x+1<n and graph[y][x+1]==0:
                    dp[y][x+1][0]+=dp[y][x][dir]
            #μ„Έλ‘œλ‘œ 온 경우
            if dir==1 or dir==2:
                if y+1<n and graph[y+1][x]==0:
                    dp[y+1][x][1]+=dp[y][x][dir]
            #λŒ€κ°μ„ μœΌλ‘œ 온 경우 (μ„Έ λ°©ν–₯ λͺ¨λ‘ κ°€λŠ₯)
            if x+1<n and y+1<n:
                if graph[y][x+1]==0 and graph[y+1][x]==0 and graph[y+1][x+1]==0:
                    dp[y+1][x+1][2]+=dp[y][x][dir]
            
print(sum(dp[-1][-1]))
λ°˜μ‘ν˜•