문제 링크
풀이
dp[v][k]를 정점 v가 루트인 서브트리에서 정점 v를 포함하면서 이사할 도시 k개를 고르는 방법의 수로 정의하겠습니다. k=0일 때는 1로 정의하도록 하죠. 그럼 아래와 같은 점화식을 구할 수 있습니다.
dp[v][k]=vi∈subtree(v)∑ki=k−1∑∏dp[vi][ki]
위 점화식을 사용하면 DFS로 트리를 탐색하면서 트리 DP를 하면 됩니다. 하지만 해당 점화식을 충분히 빠른시간에 계산해야 합니다. 어떻게 할 수 있을까요?
잘 생각해보면 다항식의 곱셈에서 위 점화식과 비슷한 식을 찾아볼 수 있습니다. n차 이하의 다항식 k개를 곱한다고 합시다. 각 다항식을 Pi(x)=i=0∑naixi라고 한다면 k개의 다항식을 곱한 결과는 아래와 같습니다.
i=1∏kPi(x)=i=0∑nk⎝⎜⎛∑rj=i∑j=1∏karj⎠⎟⎞xi
dp의 점화식과 상당히 비슷합니다. 이를 이용해봅시다. N차 이하의 다항식 Pv(x)=k=0∑Ndp[v][k]⋅xi로 정의 하겠습니다. 그러면 dp[v][k]는 vi∈subtree(v)∏Pvi(x)에서 xk의 계수가 됩니다. 즉, 자식 정점에 해당하는 다항식을 전부 곱해서 나온 다항식을 통해서 현재 정점에 해당하는 dp값을 전부 구할 수 있습니다.
정점 하나의 dp값을 전부 구하기 위해서는 N차 이하의 다항식을 N개 미만 곱해야하므로 시간복잡도는 O(N3)입니다. 정점이 총 N개이므로 전체 시간복잡도는 O(N4)이 됩니다. N≤50이기 때문에 충분히 시간안에 돌 수 있습니다.