太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。
皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一棵樹的形狀;有邊直接相連的宮殿可以互相望見。大內保衛森嚴,三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費用不同。
可是陸小鳳手上的經費不足,無論如何也沒法在每個宮殿都安置留守侍衛。
程式設計任務:幫助陸小鳳布置侍衛,在看守全部宮殿的前提下,使得花費的經費最少。
輸入檔案中資料表示一棵樹,描述如下:
第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 太平王世子事件後,陸小鳳成了皇上特聘的御前一品侍衛。皇宮以午門為起點,直到後宮嬪妃們的寢宮,呈一...