일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- spring
- 스프링 프레임워크
- binary search
- 벤쿠버
- 스타벅스
- 프로그래머스
- 라인
- STL
- 백트래킹
- 릿코드
- 백준
- jvm
- C++
- Java
- 프로그래밍언어론
- DP
- C/C++
- 머신러닝
- 모두를 위한 딥러닝
- 라인플러스
- 딥러닝
- 파이썬
- BFS
- 다이나믹프로그래밍
- Spring Framework
- leetcode
- Python
- 알고리즘
- dfs
- 시애틀
- Today
- Total
케이스윔의 개발 블로그
[백준][DP] 1520번 내리막 길 본문
문제
각 칸의 높이가 적인 지도가 주어질 때 제일 왼쪽 위 지점에서 출발하여 제일 오른쪽 아래 지점까지 항상 내리막길로만 이동하는 경로의 개수를 구하는 프로그램을 작성하시오.
문제 출처: 백준 온라인저지(https://www.acmicpc.net/problem/1520)
풀이
처음에 문제를 꼼꼼히 읽지 않고 오른쪽으로만, 아래쪽으로만 이동할 수 있도록 dp를 구현했었습니다. 그런데 문제에서 주어진 조건은 낮은 높이로 이동할 수 있는 모든 경우를 알아내야하기 때문에 지도상으로는 더 아래있는 칸에서 위로도 이동할 수 있는 경로가 있었습니다. 정렬을 써서 해야한다는 힌트를 얻었지만 어떻게 활용할지 생각이 나지 않았는데 큰 칸 먼저 dp의 값을 계산하면 4방향에서 오는 모든 경우를 구할 수 있겠다는 생각이 들었습니다.
55 99 49 48 47
54 99 50 99 46
53 52 51 99 45
이와 같은 케이스가 주어진다면 세번째 줄의 51에서 시작해서 51->50->49->48->47->46->45 와 같이 제일 오른쪽 아래를 갈 수 있습니다. 이러한 경로들을 모두 고려해주기 위해서는 무조건 높이가 높은 칸의 dp값이 계산되어 있어야 그 다음칸을 계산하는데 문제가 생기지 않습니다. 저는 그래서 처음 입력을 받을 때 높이와 함께 좌표를 priority queue에 넣어준 다음 큰 값을 뽑아내면서 그 칸을 기준으로 4방향에서 올 수 있는 경우들을 다 더해주도록 했습니다.
코드
https://github.com/kswim/Algorithm/blob/master/DP/1520.cpp
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[백준][DP] 11054번 가장 긴 바이토닉 부분 수열 (0) | 2019.02.14 |
---|---|
[백준][DP] 1005번 ACM Craft (0) | 2019.02.09 |
[백준][DP] 9251번 LCS, 9252번 LCS2 (0) | 2019.02.08 |
[백준][DP] 11055번 가장 큰 증가 부분 수열 (0) | 2019.01.31 |
[백준][DP][Bitmasking] 2133번 타일채우기 (0) | 2019.01.30 |