jiyolla   3년 전

최적 부분 구조성이 존재하니 DP로 풀리니, 반례가 존재할 수 없겠지만

그냥 막연하게 뭔가, 반례가 있을 거 같은 느낌이 있는데, 이 느낌을 어떻게 똭 "~이래서 반례는 존재하지 않다"로 시원하게 해결하고 싶네요...

제가 느낌상 존재할 반례는 이런 겁니다.

지금 당장은 A차를 움직이는 게 효율적이지만, 나중에 방문해야 될 지점 중 현재 A차의 위치와 가까운 지점이 있어서 지금 A가 가만히 있으면 오히려 이 지점을 나중에 A차가 방문하여 이득을 볼 수 있는 상황이 있지 않을까 합니다. 이런 상황이 실존하면, 단순히 전에 방문한 지점으로 현재 방문한 지점을 해결하지 못하고, 뒤에 오는 지점까지 고려해야 되니 최적부분구조성이 깨지죠. 근데 DP로 풀리는 거 보니, 또 이런 반례가 존재하지 않음을 알 수 있는데, 존재하지 않는 이유가 대충 B가 손해를 보고 현 지점을 방문해서 난 손실이 결국에 나중에 A가 볼 이득보다 더 크다 정도인데, 그냥 다 감이라서 아무의미가 없네요.

어떻게 깔끔하게 딱 최적부분구조성을 보이죠

harinboy   3년 전

DP로 어떻게 푸신다는 건지 언급이 없어 뭐라 말을 드리기가 어렵네요.

이 문제의 풀이는 단순하게 (k+1번째 사건까지의 최적 경로)= (k번째 사건까지의 최적 경로)+(두 차 중 더 가까운 것 움직이기)

가 아닙니다.

jiyolla   3년 전

찾아보니, 보통 귀류법으로 증명하는 거 같은데, 그러면 여기서 일반성을 잃지만,

f(n - 1)에 의해서 f(n)를 구하는 법을 특정 방법 하나로 제한시켜서 진행시켜보면,

일단 f(n)을 n개의 지점을 방문하는 데 이동하는 거리의 합이 최소가 되도록 하는 답과 관련된 모든 필요 정보가 담겨 있다고 해봅니다.

그 중에서 필요할 것 같은 정보면 좀 추리면, f(n) = (거리, A차 마지막 위치, B차 마지막 위치)로만 제한해봅니다.

그리고 f(n - 1)에 의해서 f(n)을 구하는 방법을 다음과 같이 정해봅니다. (f의 정의)

f(n)[거리] = f(n - 1)[거리] + min(dist(p_A, p_n), dist(p_B, p_n))이고, 여기서 p_A, p_B, p_n차례대로 A차의 마지막 위치, B차의 마지막 위치, n번째 지점입니다.

f(n)[A차 마지막 위치], f(n)[B차 마지막 위치]도 어렵지게 않게 업데이트할 수 있습니다.

자, 그러면 어떤 p_n = (x_n, y_n)이 존재하여, f'(n)[거리] < f(n)[거리]이 가 성립하게 하는 f'이 존재하는가 인데, 흠 여기서 어떻게 하죠  ㅋㅋㅋ흠....

f'이 반드시 만족해야는 조건 중에는 흠, n개의 지점을 모두 순차 방문해야 되는 것인데, 이 조건을 만족하면 거리가 갖는 최솟값을 어떻게 표현해야 다음 단계로 넘어 갈 수 있을 거 같네요..

jiyolla   3년 전

아 그게 아니군요!

게시판 글 보다가, 저렇게 해서 풀렸다는 사람이 있길래, 그런가보다 했는데 아니었군요...

jiyolla   3년 전

빠른 답변 감솨합니다! 조금 더 고민해보고 머리 너무 아프면 다시 도움 청할게요

댓글을 작성하려면 로그인해야 합니다.