太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。
皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀;某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。
可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。
幫助陸小鳳布置侍衛,在看守全部宮殿的前提下,使得花費的經費最少。
輸入檔案中資料表示一棵樹,描述如下:
第1行 n,表示樹中結點的數目。
第2行至第n+1行,每行描述每個宮殿結點資訊,依次為:該宮殿結點標號i(0對於乙個n(0 < n<=1500)個結點的樹,結點標號在1到n之間,且標號不重複。
6130
3234
21625
6350
4405
11065
0
輸出檔案僅包含乙個數,為所求的最少的經費。
25
設f[i
][0]
f[i][0]
f[i][0
] 表示當前節點站士兵;
設 f [i
][2]
f[i][2]
f[i][2
] 表示當前節點不站士兵,被父節點監視。
設 f [i
][1]
f[i][1]
f[i][1
]表示當前節點不站士兵,被他其中乙個子節點監視。
有三種情況:
第dep個節點有士兵了,那麼子節點放與不放都可以。
f[dep][0
]+=min
(f[a[i]
.to][0
],min(f[a[i]
.to][1
],f[a[i]
.to][2
]));
} f[dep][0
]+=w[dep]
;//因為放了,所以最後要加上他的經費(在迴圈外)
第dep個節點被父節點監視,所以第dep節點的子節點不會被監視到,那麼子節點的子節點 就要放士兵,用來監視第dep節點的子節點。
f [d
ep][
2]+=
f[a[
i].x
][1]
;f[dep][2]+=f[a[i].x][1];
f[dep]
[2]+
=f[a
[i].
x][1
];因為被子節點監視,只需要乙個子節點監視即可,其他子節點可放可不放,所以先對子節點可放可不放的和做乙個預處理。
for
(int i=h[dep]
;i;i=a[i]
.next)
min(所有子節點可放可不放的和- 當前子節點可放可不放+當前子結點必須放(f[a[i].to][0]))
這個式子就可以求出當前子節點放士兵監視的值了
for
(int i=h[dep]
;i;i=a[i]
.next)
f[dep][1
]=min(tt-tmp[i]
+f[a[i]
.x][0]
,f[dep][1
]);
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
//不開longlong見祖宗
ll n,h[
10001
],v[
10001
],f[
10001][
5],s[10001
],ans,tot;
struct node
a[100001];
void
add(ll x,ll y)
; h[x]
=tot;
}void
dp(ll k)
f[k][1
]+=s[k]
; ll t=0;
for(ll i=h[k]
;i>
0;i=a[i]
.next)
f[k][2
]=0x7fffffff
;for
(ll i=h[k]
;i>
0;i=a[i]
.next)
}int
main()
}for
(ll i=
1;i<=n;i++)}
return0;
}
皇宮看守 樹形DP
題意 description 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀 某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是陸小鳳手上的經費不足,無論如何也沒法...
皇宮看守(樹形dp)
description 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀 某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是陸小鳳手上的經費不足,無論如何也沒法在每個...
皇宮看守 樹形DP
time limit 10000ms memory limit 65536k total submit 63 accepted 27 case time limit 1000ms description 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一...