algorithm/DP

BOJ 2666 벽장이동

아르비스 2018. 6. 25. 17:02

BOJ#2666 벽장문의 이동

풀이법을 몰라서 서핑을 통해서 참조함

[참조 : http://stack07142.tistory.com/157]


* 문제

https://www.acmicpc.net/problem/2666


* 풀이

1. 문제 이해

벽장문을 이동을 열려있는 문이 이동한다는 것으로 바꿔서 생각해봅시다. 훨씬 편하게 문제를 이해할 수 있습니다.

열려있는 문은 항상 2개 뿐이므로 하나를 F, 나머지를 S라고 해봅시다.


열려있는 문이 이동하므로 2가지 경우가 발생합니다. 

1) F가 이동하는 경우

2) S가 이동하는 경우


2. 풀이 설계

이 문제는 벽장문의 사용 순서에 따라 탐색이 진행되고, 완전 탐색이 되어야 합니다.

이 과정에서 필요한 것, 저장시켜야 하는 것, 변화하는 것들을 이용하여 dp를 정의하고 점화식을 세워보면


(정의)

dp[pos1][pos2][idx] : 열린문 F의 위치가 pos1이고 열린문 S의 위치가 pos2 그리고 현재 탐색 위치가 idx일 때, 벽장문을 모두 사용하는데 필요한 최소 이동의 수


(점화식)

dp[pos1][pos2][idx] = min(열린문 F가 이동하는 경우, 열린문 S가 이동하는 경우)

출처: http://stack07142.tistory.com/157 [Hello World]


 D[firstPos][secondPos][idx] = Math.min(

       solve(order[idx], secondPos, idx + 1) + Math.abs((order[idx] - firstPos)),         

       solve(firstPos, order[idx], idx + 1) + Math.abs((order[idx] - secondPos))

       );



[풀이]