1. 程式人生 > 其它 >P3959 [NOIP2017 提高組] 寶藏 題解

P3959 [NOIP2017 提高組] 寶藏 題解

一道狀壓 DP 題。

發現這道題 \(n \leq 12\) 其實特別小,因此可以考慮狀壓,而且可以直接鄰接矩陣存圖。

首先我們發現這道題打通的路徑構成的圖一定是棵樹,而根節點就是起點,因此我們需要知道每一個點距離根節點的距離,也就是深度 \(dep\),根節點深度為 0。

\(f_{i,j,d}\) 表示當前被挖到的最新的點是 \(i\),已經連通的點的點集為 \(j\)(狀壓為 \(2^{12}-1\)),目前已經挖了 \(d\) 個點的最小花費。

於是我們有以下轉移方程:

\[f_{v,j,d+1}=\min\{f_{u,j|(1<<(v-1)),d}+(dep_u+1) \times e_{u,v}|u \to v\} \]

其中 \(e_{u,v}\)

\((u,v)\) 的邊權。

上述轉移方程的意義就是我們從所有可達的未選取的點中選取一個,然後進行轉移。

發現這個轉移方程寫成 DFS 的方式會更加合適,因為 DFS 除了可以進行轉移以外還可以處理 \(dep\) 陣列,於是我採用記憶化搜尋實現。

Code:GitHub CodeBase-of-Plozia P3959 [NOIP2017 提高組] 寶藏.cpp