유형 : dp
처음에는 dfs를 이용하여 모든 경로를 탐색했으나 당연히 시간초과가 나왔다.
문제풀이
1. dp를 활용해야 하는데, dp[r][c]는 (r,c)에 올 수 있는 경우의 수이다. (r,c)에서 갈 수 있는 길이가 a라 하면, (r+a,c), (r,c+a) 두 가지 경우가 가능하다. 두 경우 가능한 경우의 dp 값에 dp[r][c]를 더해주면 된다.
2. 1의 과정을 (0,0)부터 (n-1,n-1)까지 반복한다.
요약
모든 경로를 다 고려할 필요 없이, dp를 이용하여 (r,c)에서 (r',c')으로 이동한다고 하면, dp[r'][c'] += dp[r][c]를 해주면 중복되는 경로들을 다시 탐색하지 않아도 된다.
Python Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import sys
def solution():
dp[0][0] = 1
for r in range(n):
for c in range(n):
l = maps[r][c]
if l == 0 or dp[r][c] == 0 :
continue
new_r = r+l
new_c = c+l
if new_r < n:
dp[new_r][c] += dp[r][c]
if new_c < n:
dp[r][new_c] += dp[r][c]
print(dp[n-1][n-1])
if __name__=="__main__":
n = int(sys.stdin.readline())
maps = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]
dp=[[0 for i in range(n)] for j in range(n)]
solution()
|
cs |
line 3 : 0,0에서 시작할 것이니, dp[0][0]은 0이 아닌 1로 해주어야한다.
line 7 : (r,c)에서 갈 수 있는 경우가 0이거나 (r,c)에 도착 할 수 있는 경우의 수가 0이라면 고려할 필요가 없다.
line 12, 14 : 위에서 언급한 dp[r'][c'] += dp[r][c] 과정.
길이가 N인 정사각형에 대하여 이중 포문을 도므로 시간복잡도는 O(N^2)이 된다.
문제 링크
1890번: 점프
문제 N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다. 각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로
www.acmicpc.net
'알고리즘 > 백준' 카테고리의 다른 글
백준 17214 다항 함수의 적분 (0) | 2020.03.10 |
---|---|
백준 2869 달팽이는 올라가고 싶다 (0) | 2020.03.09 |
백준 17478 재귀함수가 뭔가요? (0) | 2020.03.08 |
백준 2293 동전 1 (0) | 2020.03.01 |
백준 1038 감소하는 수 (0) | 2020.02.28 |