백준/DP

[dp/백준] 1520번: 내리막길

ydin 2022. 6. 13. 23:20

-문제:https://www.acmicpc.net/problem/1520

dfs랑 dp를 이용해서 풀어야하는 문제다. dfs는 어찌저찌 구현했는데, 경로가 겹칠 때 가짓수를 추가하는걸 어떻게 해야할지 몰랐다. 경로 갯수를 어떻게 누적해야하는지 몰랐던 문제. 골드 4레벨 문제였다. 

 

-정답풀이: 

재귀함수로 진행되므로 탈출 조건을 명시한다(x==m-1 and y=n-1)

dp[x][y]!=-1인 경우는 (x,y)를 지나간 경로가 있다는 말이므로, 그때의 값을 반환한다 

그게 아닌 경우는 (x,y)는 처음 지나가는 것이므로 dp[x][y]=-1+1=0을 해준다 

 

내리막길이므로, data 값이 작은 경우에만 dfs를 실행한다. 

다음 이동 지점에 대한 dfs값을 (x,y) 경로 경우의 수의 값에 추가한다 

m,n=map(int,input().split())
data=[]
for _ in range(m):
    data.append(list(map(int,input().split())))
dp=[[-1]*n for _ in range(m)]
dx=[-1,1,0,0]
dy=[0,0,-1,1]

def dfs(x,y):
    if x==m-1 and y==n-1:
        return 1   
    if dp[x][y]!=-1:
        return dp[x][y]
    dp[x][y]=0    
    for i in range(4):
        nx,ny=x+dx[i],y+dy[i]
        if 0<=nx<m and 0<=ny<n:
            if data[nx][ny]<data[x][y]:
                dp[x][y]+=dfs(nx,ny)
    return dp[x][y]
print(dfs(0,0))