皇宮看守(樹形dp)

2021-07-11 21:38:45 字數 2027 閱讀 1580

description

太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。 

皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀;某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。 

可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。 

input

幫助陸小鳳布置侍衛,在看守全部宮殿的前提下,使得花費的經費最少。

output

輸入檔案中資料表示一棵樹,描述如下: 

第1行 n,表示樹中結點的數目。 

第2行至第n+1行,每行描述每個宮殿結點資訊,依次為:該宮殿結點標號i(0

sampleinput

輸出檔案僅包含乙個數,為所求的最少的經費。
sample output

6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0
hint

25

分析:考慮到樹的特性:每乙個點只和它的父親和兒子有關係,又是求最優方案,所以我們考慮用dp來做。要求只考慮節點為i的樹的最佳方案vi,只需要看他是否被選即可。即vi=min(vi1,vi2) (2表示不選,1表示選)。

f[i]=min(f[i,1],f[i,2]);

f[i,1]=w[i]+∑min(f[j],∑min(f[k,1],f[k,2]))

f[i,2]=∑f[j]; 若所有f[j]

(j為i的每個兒子,k為j的兒子)

邊界條件:

f[i]=f[i,1]

f[i,1]=w[i]

f[i,2]=maxlongint;

答案為min(f[root],f[root,2])

主要程式:

procedure dfs(r:longint);
var
i,j,k:longint;
c,t,ii:longint;
begin
v[r]:=false;
if a[r,0]=0
then
begin  {邊界}
f[r,0]:=w[r];  //f[r,0]即為上面的f[r]
f[r,1]:=0;
f[r,2]:=w[r];
exit;
end;
for i:=1 to a[r,0] do
if v[a[r,i]] then dfs(a[r,i]);
t:=0;
for i:=1 to a[r,0] do
begin
c:=a[r,i];
t:=t+min(f[c,0],f[c,2]);
end;
f[r,2]:=maxlongint;
ii:=t;
for i:=1 to a[r,0] do
begin
c:=a[r,i];
f[r,0]:=f[r,0]+min(min(f[c,0],f[c,1]),f[c,2]);  {狀態轉移方程}
f[r,1]:=f[r,1]+min(f[c,0],f[c,2]);
t:=t-min(f[c,0],f[c,2])+f[c,0];
f[r,2]:=min(f[r,2],t);
t:=ii;
end;
f[r,0]:=f[r,0]+w[r];
end;

皇宮看守 樹形DP

題意 description 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀 某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是陸小鳳手上的經費不足,無論如何也沒法...

皇宮看守 樹形DP

time limit 10000ms memory limit 65536k total submit 63 accepted 27 case time limit 1000ms description 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一...

皇宮看守 樹形DP

太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀 某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。程式...