樹型DP 皇宮看守

2021-09-25 11:04:58 字數 1191 閱讀 6394

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

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

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

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

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

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

第2行至第n+1行,每行描述每個宮殿結點資訊,依次為:該宮殿結點標號i(0對於乙個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
這題看似和戰略遊戲很像,但其實狀態轉移方程要注意的點挺多的,這題查了資料也看了一會用紙算了下才弄清楚,首先就是開dp二維陣列dp[i][0],dp[i][1],dp[i][2]分別表示i點被子結點、自己點、父節點的侍衛照看。所以分了三個情況討論,首先對於dp[i][2]即被父節點照看,當前點的經費增值就等於各子結點v被v點侍衛照看和被v子結點的侍衛照看(不會出現v被父節點照看因為dp[i][2]就已經表示了i點無侍衛)兩者的最小值;對於dp[i][1]即被自己點的侍衛照看,當前點的經費增量就是各子結點任意情況下的最小值(i點有侍衛對子結點完全無影響);最麻煩的是dp[i][0]的情況,由於i被子結點v的侍衛照看,那麼i的子結點v中至少有乙個是選取了dp[v][1]的情況,即子結點v中至少有乙個結點有侍衛,所以當前情況的增量就等於各子結點v被v點侍衛照看和被v的子結點侍衛照看的最小值,如果沒有乙個子結點v上有侍衛,那麼最後再加上v中dp[v][1]和dp[v][0]差值的最小值,強行選擇乙個v點放置侍衛。

#include#includeusing namespace std;

int n,dp[1505][3];

struct palace

p[1505];

vectorson[1505];

void dfs(int u,int x)

}dfs(1,-1);

cout<

皇宮看守 樹形DP

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

皇宮看守(樹形dp)

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

皇宮看守 樹形DP

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