-문제: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))
'백준 > DP' 카테고리의 다른 글
[dp/백준] 2225번: 합분해 (0) | 2022.06.16 |
---|---|
[dp/백준] 2294번: 동전2 (0) | 2022.06.16 |
[dp/백준] 11048번: 이동하기 (0) | 2022.06.13 |
[dp/백준] 2133번: 타일 채우기 (0) | 2022.06.11 |
[dp/백준] 11722번: 가장 긴 감소하는 수열 (0) | 2022.06.11 |