백준-1520-내리막 길
업데이트:
문제
풀이
문제조건 해석
내리막 길에서 이동 가능한 경로의 수 구하는 문제.
알고리즘
DP문제
- 재귀로 추상화하기 적합한 문제
- 재귀 이용할 때는 항상
recursionlimit
설정해주기
코드
from sys import stdin, setrecursionlimit
input = stdin.readline
setrecursionlimit(500*500)
m, n = [int(x) for x in input().rstrip().split()]
maps = []
for _ in range(m):
maps.append([int(x) for x in input().rstrip().split()])
# DFS+DP로 풀어보자
def memo(func):
cache = {}
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
@memo
def dfs(i, j):
if (i, j) == (m-1, n-1):
return 1
cnt = 0
for di, dj in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
if not (0 <= i+di < m and 0 <= j+ dj < n):
continue
if maps[i+di][j+dj] < maps[i][j]:
cnt += dfs(i+di, j+dj)
return cnt
print(dfs(0, 0))
배운점
점화식을 세우는 것이 적합한 DP / 재귀가 적합한 DP 잘 구분해야겠다.
댓글남기기