樹形dp 之 小胖守皇宮

2022-02-03 11:21:13 字數 1592 閱讀 5872

huyichen世子事件後,xuzhenyi成了皇上特聘的御前一品侍衛。

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

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

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

輸入格式

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

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

第2行至第\(n+1\)行,每行描述每個宮殿結點資訊,依次為:該宮殿結點標號\(i(0,在該宮殿安置侍衛所需的經費\(k\),該邊的兒子數\(m\),接下來\(m\)個數,分別是這個節點的\(m\)個兒子的標號\(r_1,r_2,...,r_m\)。

對於乙個\(n(0 < n <= 1500)\)個結點的樹,結點標號在\(1\)到\(n\)之間,且標號不重複。

輸出格式

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

6

1 30 3 2 3 4

2 16 2 5 6

3 5 0

4 4 0

5 11 0

6 5 0

25
當我們分析乙個節點的時候,很容易想到起碼有兩種情況:在這個節點設侍衛或者不設。但是如果單純地只是分析它不設,那麼依據題意,它必須得被觀測到,那麼它的子節點到底要不要設呢?此時便又要分兩種情況:被兒子觀測或是被父親觀測。因此到這裡我們把這個題已經抽象成了三種狀態轉移:

f[i][1]+=min(f[v][1],f[v][2]);//既然預設自己不會設點,就不可能有f[v][3]這個狀態

f[i][1]+=t;

f[i][2]+=min(f[v][1],f[v][2],f[v][3]);
f[i][3]+=min(f[v][1],f[v][2]);
#include #include #include #include #include using namespace std;

const int maxn=1500+50,

inf=0x3f3f3f3f;

vectorson_id[maxn];

int f[maxn][4],//樹形dp : 1=>son 2=>itself 3=>father

cnt[maxn],//出現次數

son_num[maxn],//兒子數目

cost[maxn];//所需的經費

int n;

void tree_dp(int x)

}for(int i=1;i<=n;i++)

if(cnt[i]==0)

return 0;

}

VIJOS P1144 小胖守皇宮(樹形dp)

對於每乙個節點,有3種狀態 自己守自己,被兒子守,被父親守 每次用兒子更新父節點。設f st 0 表示被自己守,它的兒子三種狀態都可以 f st 2 表示被父親守,那麼這個節點不能守它的兒子,它的兒子有兩種狀態 被自己守,被兒子守 f st 1 表示被兒子守。當兒子的最優狀態為自己守自己,這就非常和...

vijos1144 小胖守皇宮《樹形dp

woc我竟然a了,這道經典的樹形dp或者說是樹形dp的入門題我終於過了,雖然之前做過一些樹形dp的題,但是這題開始還是一臉懵逼,dp方程如何定義都知道,但是不懂轉移啊,這就有點傷了。dp方程定義dp i 1 節點i 選自己 dp i 2 節點i選自己的兒子 不選自己和父親 dp i 3 節點i選自己...

樹形dp vijos1144小胖守皇宮

細節很精妙 huyichen世子事件後,xuzhenyi成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀 某些宮殿間可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。可是xuzhenyi手上的經費不足,無...