dfs + dp 를 이용해서 풀었다
그냥 재귀를 돌면 시간초과가 나기 때문에 memoization을 이용해서 dp에 해당 좌표에서 끝점까지 가는 경로의 수가 저장되도록, 해당 좌표의 dp 값이 -1이 아닌 경우에는 탐색을 더 깊게 진행하지 않고 이를 반환해주도록 구현하였다
4 5
50 45 37 32 30
35 50 40 20 25
30 30 25 17 28
27 24 22 15 10
[[-1, -1, -1, -1, -1], [-1, -1, -1, -1, -1], [-1, -1, -1, -1, -1], [-1, -1, -1, 1, -1]]
[[-1, -1, -1, -1, -1], [-1, -1, -1, -1, -1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, -1, -1, -1, -1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, -1, -1, -1, -1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, -1, -1, -1, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, -1, -1, 2, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, -1, 2, 2, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, 2, 2, 2, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, -1, -1, 1, -1]]
[[-1, 2, 2, 2, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, -1, 1, 1, -1]]
[[-1, 2, 2, 2, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [-1, 1, 1, 1, -1]]
[[-1, 2, 2, 2, 1], [-1, -1, -1, 1, 1], [-1, -1, -1, 1, -1], [1, 1, 1, 1, -1]]
[[-1, 2, 2, 2, 1], [-1, -1, -1, 1, 1], [1, -1, -1, 1, -1], [1, 1, 1, 1, -1]]
[[-1, 2, 2, 2, 1], [1, -1, -1, 1, 1], [1, -1, -1, 1, -1], [1, 1, 1, 1, -1]]
[[3, 2, 2, 2, 1], [1, -1, -1, 1, 1], [1, -1, -1, 1, -1], [1, 1, 1, 1, -1]] -> 최종 dp 테이블
import sys
dx = (0, 0, -1, 1)
dy = (-1, 1, 0, 0)
def dfs(x, y):
global result
if (x, y) == (M-1, N-1):
result += 1
return
for i in range(4):
nx = x + dx[i]; ny = y + dy[i]
if 0 <= nx < M and 0 <= ny < N:
if board[x][y] > board[nx][ny] and not visit[nx][ny]:
visit[nx][ny] = True
dfs(nx, ny)
visit[nx][ny] = False
M, N = map(int, sys.stdin.readline()[:-1].split())
board = []
for m in range(M):
board.append(list(map(int, sys.stdin.readline()[:-1].split())))
result = 0
visit = [[False] * N for _ in range(M)]
visit[0][0] = True
dfs(0, 0)
print(result)
import sys
dx = (0, 0, -1, 1)
dy = (-1, 1, 0, 0)
def dfs(x, y):
if (x, y) == (M-1, N-1):
return 1
if dp[x][y] != -1:
return dp[x][y]
cnt = 0
for i in range(4):
nx = x + dx[i]; ny = y + dy[i]
if 0 <= nx < M and 0 <= ny < N:
if board[x][y] > board[nx][ny]:
cnt += dfs(nx, ny)
dp[x][y] = cnt
return dp[x][y]
M, N = map(int, sys.stdin.readline()[:-1].split())
board = []
for m in range(M):
board.append(list(map(int, sys.stdin.readline()[:-1].split())))
dp = [[-1] * N for _ in range(M)]
print(dfs(0, 0))