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手上的經費不足,無...