警衛安排 題解

2021-04-30 04:39:40 字數 1445 閱讀 5846

警衛安排(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...