警衛安排(dp好題)

2022-04-30 10:45:07 字數 864 閱讀 9559

警衛安排(guard)

【題目描述】

乙個重要的基地被分為 n 個連通的區域。出於某種神秘的原因,這些區域以乙個區域為核心,呈

一顆樹形分布。

在每個區域安排警衛所需要的費用是不同的,而每個區域的警衛都可以望見其相鄰的區域,只要

乙個區域被乙個警衛望見或者是安排有警衛,這個區域就是安全的。你的任務是:在確保所有區域都

是安全的情況下,找到安排警衛的最小費用。

【輸入格式】

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

接下來的 n 行描述了n 個區域的資訊,每一行包含的整數依次為:區域的標號i(0一開始被樣例誤導,樣例是按照1到n的順序來給資訊的,然後我的輸入也預設成這樣,結果爆0了。修改過後也只過了2個點。雖然培訓時講過這題,但是不自己寫一遍還真是理解不夠透徹。。

f[node][1],f[node][2],f[node][3]分別表示 監控以node為根的樹,在node放警衛/node被他的兒子監控(他自己沒有警衛)/node被他的父親監控。

f[node][1]=sum+cost[node];

f[node][2]比較麻煩,首先既然node被兒子管著,那麼有限制「至少有乙個兒子是放了警衛的」,因此先假設沒有這個限制,那麼f[node][2]=sum},接著列舉哪個兒子一定放了警衛,假設是編號為k的兒子,那麼f[node][2]還要減去min再加上f[k][1];

一開始寫成f[node][3]=min;但仔細揣摩這樣是不對的。node被父親管著,不一定要被他的兒子管著,或者他自己有警衛,比如他自己和兒子都沒警衛,但是兒子的兒子有警衛也是可行的。所以只要考慮他的兒子被管住的情況,也就是f[node][3]=sum},再和f[node][1]比較取最小值。

此題不易,必須要有清晰的頭腦才能把關係理清楚。

警衛安排 題解

警衛安排 security.pas c cpp 乙個重要的基地被分為n個連通的區域。出於某種神秘的原因,這些區域以乙個區域為核心,呈一顆樹形分布。在每個區域安排警衛所需要的費用是不同的,而每個區域的警衛都可以望見其相鄰的區域,只要乙個區域被乙個警衛望見或者是安排有警衛,這個區域就是安全的。你的任務是...

快餐問題(dp好題)

peter最近在r市開了一家快餐店,為了招攬顧客,該快餐店準備推出一種 該 由a個 漢堡,b個薯條和c個飲料組成。便宜。為了提高產量,peter從著名的麥當勞公司引進了n條 生產線。所有的生產線都可以生產漢堡,薯條和飲料,由於每條生產線每天所能提供的生產時間是有 限的 不同的,而漢堡,薯條和飲料的單...

絕世好題 線性dp

給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len input 輸入檔案共2行。第一行包括乙個整數n。第二行包括n個整數,第i個整數表示ai。output 輸出檔案共一行。包括乙個整數,表示子串行bi的最長長度。sample input3 1 2 3 s...