警衛安排(security.pas/c/cpp)
乙個重要的基地被分為n個連通的區域。出於某種神秘的原因,這些區域以乙個區域為核心,呈一顆樹形分布。
在每個區域安排警衛所需要的費用是不同的,而每個區域的警衛都可以望見其相鄰的區域,只要乙個區域被乙個警衛望見或者是安排有警衛,這個區域就是安全的。你的任務是:在確保所有區域都是安全的情況下,找到安排警衛的最小費用。
輸入資料
第一行n,表示樹中結點的數目。
接下來的n行描述了n個區域的資訊,每一行包含的整數依次為:區域的標號i(0,在區域i安排警衛的費用k,區域i的子結點數目m,接下來m個數為區域i的子結點編號。
輸出資料
一行乙個整數,為最小的安排費用。
樣例輸入與輸出
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資料範圍
對於所有的資料,0。
這道題是明顯的dp,他的分布是樹型的。資料規模小,只要dfs+dp即可
每個安全結點i都有3個合法狀態,分別為:
1.被父親結點上安排的警衛看到,設為f[i][0]。
2.在該結點安排警衛,設為f[i][1]。
3.被子結點上安排的警衛看到,設為f[i][2]。
現在只需針對三種狀態,設計出狀態轉移方程。
對於f[i][0],i的每個子節點要麼安排警衛,要麼被其子結點安排的警衛看到,所以有:
f[i][0]=∑min(f[k][1],f[k][2])
, k
為i的子結點
對於f[i][1],i的每個子結點可以任取一種狀態,所以有:
f[i][1]=∑min(f[k][0],f[k][1],f[k][2])+w[i]
, k
為i的子結點
對於f[i][2],則需要列舉乙個子結點安排警衛,其他子結點可任取狀態2和狀態3,所以有:
f[i][2]=∑min(f[k][1],f[k][2])+f[j][1]
,k為i的子結點j
為列舉的點,k≠j。
狀態轉移方程並不難想,關鍵是它的分類情況
pascal: c:
警衛安排(dp好題)
警衛安排 guard 題目描述 乙個重要的基地被分為 n 個連通的區域。出於某種神秘的原因,這些區域以乙個區域為核心,呈 一顆樹形分布。在每個區域安排警衛所需要的費用是不同的,而每個區域的警衛都可以望見其相鄰的區域,只要 乙個區域被乙個警衛望見或者是安排有警衛,這個區域就是安全的。你的任務是 在確保...
演講大廳安排 題解
演講大廳安排 description 有乙個演講大廳需要我們管理,演講者們事先定好了需要演講的起始時間和中止時間。我們想讓演講大廳得到最大可能的使用。我們要接受一些預定而拒絕其他的預定,目標是使演講者使用大廳的時間最長。假設在某一時刻乙個演講結束,另乙個演講就可以立即開始。請依據演講者的申請,計算出...
nestjs警衛之GuardsConsumer類
guardsconsumer類用來建立乙個指定控制器物件 路由方法物件 guard陣列的呼叫方法,用來加入路由方法中 nestjs core guards guards consumer.ts import iterate from iterare import from nestjs common...