입력으로 그래프. 사무실을 v1으로 나머지 v2 v3 v4는 내가 영업 뛰어야 하는곳.
Worst case =>(n-1)(n-2)(n-3)...1 = (n-1)! = O(n!)
Ex)
부분문제를 사이즈가 제일 작을때까지 먼저 계산하고, 최종을 계산해
v1->v2 일때는 v2->{v3,v4} 일때의 부분문제를 풀면되고
v1->v3 일때도 v3->{v2,v4} 동일...
최종적으로 나온 v1->v2 , v1->v3, v1->v4 의 경우 중에 젤 작은걸 선택!
출발지가 1인경우는 최종 밖에 안돼.
이런 경우
부분문제에서는 나올 수 없어
부분집합에서 D[vi][A]. A에서는 i가 한번 나왔으니까 i 가 절대 나오지 않아
D[vi][A] = min(W[i][j] + D[vj][A-{vj}]) i~j까지는 왔으니까vj에서 출발. 풀려고 한 A에서 한놈은 방문했으니 후보가 A- vj(방금방문) 까지 가야해
Ex)
이렇게 연쇄적으로 DP
Ex) P사용 방법
열 인덱스가 다 공집합
vi -> v1 인경우니까 W[i][1]
원소의 개수가 한개
D배열을 참조하게 되어있고, D배열은 자기보다 한개 적은 배열(원소의 개수가 0개인 위에 그림) 을 참조!
W+D 한번만
-A 원소의 개수가 두개
여기서는 또 D배열이 원소의 개수가 1개인 위에 그림을 참조!
W+D 2번
...최종 A의 사이즈가 n-1개 까지 가서 마지막 문제(min(W[1][j]+ D[vj][V-{v1,vj}])를 푼다!
가장 많이 도는 부분에서 3중 for 문 안에 min(W[1][j]+ D[j][A-(vj)]) 이 Baisc Operation
가장 바깥 부분은 A의 사이즈를 결정 (k는 A의 사이즈)
ex) 여기서는 n-2번 돌아
두번째 for문은 A라는 집합을 각각 만들어줘야해
ex) 여기서는 조합 (n-1)C(k)
세번째 for문은 구체적인 i를 결정해줘(i는 v1이 될 수 없고 A안에 있으면 안돼)
ex) A의 원소의 개수는 k임으로 여기서는 n-1-k 번 돌아
마지막 min은 A라는 집합의 원소가 3개면 min은 W+D가 3개가 나와
ex) 여기서는 k번 돌아
k를 모두 더하면
조합을 꺠려면 이 공식을 이용
n-2를 보정한다음 계산
최종
따라서 O(n^2 * 2^n)
D배열 뿐만아니라 똑같은 P배열도 있으니 O(n2^n)