일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- COSPROJAVA1급
- QUICKSTARTGUIDE
- java
- 완전탐색
- DFS
- 재귀함수
- 네트워크플로우
- 게더타운시작
- BFS
- COSPRO
- 시뮬레이션
- 다익스트라
- 백준
- spring
- 세그먼트트리
- GatherTown
- 엘라스틱서치
- 이젠 골드구현도 어렵네..
- deque
- 01BFS
- 백준코딩테스트
- 우선순위큐
- 취득후기
- 자바PS
- 구현
- 다이나믹프로그래밍
- dp
- PS
- YBMCOS
- 알고리즘
- Today
- Total
공부공간
BOJ - 2096 ) 내려가기 본문
문제 해결 접근
별로 어렵지 않은 형태의 기본적인 동적 프로그래밍의 문제로 보인다. 입력받은 점수 행렬은 3개의 열을 가지며 항상 최대, 최소 값을 갱신하도록 알고리즘을 설계하여 준다. 해당 문제의 점화식은 다음과 같다.
minDP[i][0] = min(minDP[i-1][0] , minDP[i-1][1]) + map[i][0]
minDP[i][1] = min(minDP[i-1][0], min(minDP[i-1][1], minDP[i-1][2])) + map[i][1]
minDP[i][2] = min(minDP[i-1][1] , minDP[i-1][2]) + map[i][2]
한 행이 진행 될때마다, 이전 행렬의 합산 값을 비교하여 최소 혹은 최대의 값과 현재 행렬의 값을 더해준다.
따라서 다음과 같이 코딩을 해주면...
배열의 크기 때문에 메모리 초과가 일어난다. 따라서, 이를 방지하기 위하여 배열 크기의 조정이 필요하다. 최소값과 최대값을 갱신하여 주는 배열은 주어지는 N 값 만큼의 크기가 필요하지 않다. 즉, 주어진 N 만큼의 크기를 일일히 갱신하여 주는 것이 최종 값을 도출하는 데에 필요하지 않기 때문에 갱신을 위해 비교해야 하는 이전 행의 값을 저장하는 행과 갱신된 값을 저장하는 행 두가지가 필요하다. 이는 다음과 같이 표현이 가능하다.
d[1][0] = map[i][0] + max(d[0][0], d[0][1]);
d[1][1] = map[i][1] + max(d[0][0], max(d[0][1], d[0][2]));
d[1][2] = map[i][2] + max(d[0][1], d[0][2]);
d[0][0] = d[1][0];
d[0][1] = d[1][1];
d[0][2] = d[1][2];
dp[1][0] = map[i][0] + min(dp[0][0], dp[0][1]);
dp[1][1] = map[i][1] + min(dp[0][1], min(dp[0][0], dp[0][2]));
dp[1][2] = map[i][2] + min(dp[0][2], dp[0][1]);
dp[0][0] = dp[1][0];
dp[0][1] = dp[1][1];
dp[0][2] = dp[1][2];
최대값을 갱신하는 d[2][3] 행렬은, 이전의 행과 비교값을 d[1][0~2] 에 저장하고, 이를 다시 d[0][0~2] 의 값에 대입하여 초기화 해준다.
'알고리즘 > Dynamic Programming' 카테고리의 다른 글
BOJ - 2096 ) 내려가기 (0) | 2020.06.29 |
---|---|
BOJ - 2075 ) N번째 큰 수 (0) | 2020.06.29 |
BOJ - 11066 ) 파일 합치기 (0) | 2020.02.11 |
BOJ - 1965) 상자 넣기 (0) | 2020.02.06 |
BOJ - 1890 ) 점프 (0) | 2020.01.30 |