傳送門
參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n
nn 個深埋在地下的寶藏屋, 也給出了這 n
nn 個寶藏屋之間可供開發的 m
mm 條道路和它們的長度。
小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道路則相對容易很多。
小明的決心感動了考古挖掘的贊助商,贊助商決定免費贊助他打通一條從地面到某個寶藏屋的通道,通往哪個寶藏屋則由小明來決定。
在此基礎上,小明還需要考慮如何開鑿寶藏屋之間的道路。已經開鑿出的道路可以任意通行不消耗代價。每開鑿出一條新道路,小明就會與考古隊一起挖掘出由該條道路所能到達的寶藏屋的寶藏。另外,小明不想開發無用道路,即兩個已經被挖掘過的寶藏屋之間的道路無需再開發。
新開發一條道路的代價是:
l ×k
\mathrm \times \mathrm
l×k
l
\mathrm
l 代表這條道路的長度,k
\mathrm
k 代表從贊助商幫你打通的寶藏屋到這條道路起點的寶藏屋所經過的寶藏屋的數量(包括贊助商幫你打通的寶藏屋和這條道路起點的寶藏屋)。
請你編寫程式為小明選定由贊助商打通的寶藏屋和之後開鑿的道路,使得工程總代價最小,並輸出這個最小值。
資料範圍:1≤n
≤12
1≤n≤12
1≤n≤12
,0 ≤m
≤1000
0 \le m \le 1000
0≤m≤10
00,v
≤500000
v \le 500000
v≤5000
00。下面的內容**於 henry__huang
的部落格。
設 f [i
][j]
f[i][j]
f[i][j
] 表示當前樹高為 i
ii,已經選了的點集的集合為 j
jj,那麼狀態轉移方程為:
f [i
][j]
=mink
∈j
f[i][j]=\min_\ \;k]+dis[j \;\mathrm \; k][k]⋅(i-1)\}
f[i][j
]=k∈
jmin
其中 dis
[i][
j]
dis[i][j]
dis[i]
[j] 表示從 i
ii 這個已選點集加上下一層將要選的 j
jj 這個點集所需要的最小花費。
這個轉移方程應該挺顯然的,就是在原樹上加一些點構成新樹。
d is
[i][
j]
dis[i][j]
dis[i]
[j] 遞推式如下:
d is
[i][
j]=d
is[i
][jx
orlo
wbit
(j)]
+mink
∈i
dis[i][j]=dis[i][j \;\mathrm \; \mathrm(j)]+\min_\(j)+1][k]\}
dis[i]
[j]=
dis[
i][j
xorl
owbi
t(j)
]+k∈
imin
這就相當於是把 low
bit(
j)
\mathrm(j)
lowbit
(j) 的那個點先拿出來,最後再單獨統計貢獻。
時間複雜度 o(n
2n
)o(n2^n)
o(n2n)
。
小 tip:列舉 sss 子集的方法。
for
(int i=s;i;i=
(i-1
)&s)
#include
#include
#include
#define lowbit(x) (x&(-x))
using
namespace std;
const
int n=
15,s=(1
<<12)
+5;int n,m,e[n]
[n],f[n]
[s],q[s]
,dis[s]
[s],sum[s]
,log[s]
;int
main()
int sta=(1
<;for
(int i=
2;i<=sta;
++i) log[i]
=log[i/2]
+1;for
(int i=
1;i<=sta;
++i)
}memset
(f,0x3f
,sizeof
(f))
;for
(int i=
0;i++i) f[1]
[1<;for
(int i=
1;i<=sta;
++i)
for(
int i=
2;i<=n;
++i)
}int ans=
1<<30;
for(
int i=
1;i<=n;
++i) ans=
min(ans,f[i]
[sta]);
printf
("%d\n"
,ans)
;return0;
}
NOIP2017 提高組 寶藏
狀態壓縮好題。下面我們來一一分析一下這道題的總體想法。容易發現,n leq12 暗示這道題時間複雜度為指數級別的。由於題目表明 兩個已經被挖掘過的寶藏屋之間的道路無需再開發。所以,我們開發的路徑構成的只能是一棵樹,不能是有環的圖。因此,我們可以將題目抽象成 給定一張有 n 個點的圖,求出一棵生成樹 ...
NOIP2017提高組正式賽 寶藏
description 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n 個深埋在地下的寶藏屋,也給出了這 n 個寶藏屋之間可供開發的 m 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶...
Noip2017提高組 乳酪
noip 2017 提高組 不怎麼難啦 思路如下 首先先寫乙個函式判斷兩個洞是否相連,即兩洞之間距離是否小於等於球直徑 注意是直徑 struct dong dong p 1001 bool pd dong a,dong b 第二個難點在於如何判斷是否可以穿過乳酪,對此我們可以模擬老鼠鑽洞 run函式...