문제
출처 : www.acmicpc.net/problem/14699
N개의 쉼터가 있고, 쉼터둘을 연결하는 M개의 도로가 있다.
각 쉼터에는 높이가 있으며, 항상 현재쉼터보다 높은위치로만 갈수있다고할때,
각 쉼터에서 최대한으로 방문할수있는 쉼터의 갯수를 구하는 문제다.
풀이
전에 풀었던 Dp+DFS문제인
욕심쟁이 판다 : www.acmicpc.net/problem/1937
와 비슷한 유형?의 문제라고 생각했다
*항상 현재 쉼터 보다 높은 쉼터로만 갈수있으므로, 단방향 간선이다 (같은높이에있는 쉼터로도 갈수없다)*
각 쉼터에서 시작할때마다 모든정점을 봐주면 너무 오래걸린다.
(쉼터가 5000개 간선이 100000개 있으므로, 약 5억번 반복한다고 생각함)
따라서 한 쉼터에서 시작했을때,
지나가는 모든 쉼터에대해서 최대로 지나갈수있는 쉼터의 갯수를 저장해줘야한다.
예를들어, 예제의 경우
1번 쉼터에서 시작했을때,
1 -> 4 -> 3
혹은
1 -> 5
이 두가지 경로를 지나가게 될것이고
1번쉼터에서 최대로 지나갈수있는 쉼터는 (자기자신을 포함하여) 총 3개이다 (1 -> 4 -> 3)
따라서
dp[1] = 3
dp[4] = 2
dp[3] = 1
로 초기화 된다.
다음 2번쉼터에서 탐색을 시작했을때,
1번 쉼터와 4번 쉼터로 올라가고,
이때 dp[1]과 dp[4]의 값이 각각 이미 업데이트 되어있으므로 dp[1]의 값과 dp[4]의값을 리턴하고 더이상 탐색하지않는다.
이때 dp[4]보다 dp[2]의 값이 더 크므로 dp[1] = 3 + 1(이동횟수) = 4 가 된다.
이런식으로 탐색 시간을 최소화 하면서 풀면된다.
소스코드
'알고리즘 (2020 : 08 : 10 ~ ) > 다이나믹 프로그래밍' 카테고리의 다른 글
[백준 / BOJ] 1005 ACM Craft (0) | 2020.11.27 |
---|---|
[백준 / BOJ] 10164 격자상의 경로 (0) | 2020.11.24 |
[백준/BOJ] 11560 다항식 게임 (0) | 2020.10.29 |
[백준 / BOJ] 14720 우유 축제 (0) | 2020.10.11 |
[백준 / BOJ] 11062 카드게임 (0) | 2020.10.06 |