樹形DP 戰略遊戲

2021-10-09 04:12:21 字數 1762 閱讀 5598

description

input

.輸入檔案中資料表示一棵樹,描述如下:

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

第二行至第n+1行,每行描述每個結點資訊,依次為:該結點標號i,k(後面有k條邊與結點i相連),接下來k個數,分別是每條邊的另乙個結點標號r1,r2,…,rk。

對於乙個n(0 < n <= 1500)個結點的樹,結點標號在0到n-1之間,在輸入檔案中每條邊只出現一次。

output

.輸出檔案僅包含乙個數,為所求的最少的士兵數目。

例如,對於如右圖所示的樹:

答案為1(只要乙個士兵在結點1上)。

sample input

樣例1

4

0 1 1

1 2 2 3

2 03 0

樣例1圖

樣例2

5

3 3 1 4 2

1 1 0

2 00 0

4 0

sample output樣例1

1
樣例2

2
hint解題思路

設f [r

oot]

[1]f[root][1]

f[root

][1]

為第r oo

troot

root

個點有士兵,f[r

oot]

[0]f[root][0]

f[root

][0]

為第r oo

troot

root

個點沒有士兵

如果當前點選了士兵,那麼它的子節點可選可不選

f[root][1

]+=min(f[a[i]

.to][0

],f[a[i]

.to][1]);

如果當前點沒有士兵,那麼它的子節點必須選

f[root][0

]+=f[a[i]

.to][1

];

注意

因為這是個單向的樹,所以一開始遞迴的時候必須從根開始

code

#include

#include

using namespace std;

struct dt

a[2000*2

];int head[

2000

],n,num,f[

2000][

2],t[2000];

void

dp(int root)

}int main()

}for

(int i=

0;i<=n;i++)if

(!t[i]

)}

樹形DP 戰略遊戲

鮑勃喜歡玩電腦遊戲,特別是戰略遊戲,但有時他找不到解決問題的方法,這讓他很傷心。現在他有以下問題。他必須保護一座中世紀城市,這條城市的道路構成了一棵樹。每個節點上的士兵可以觀察到所有和這個點相連的邊。他必須在節點上放置最少數量的士兵,以便他們可以觀察到所有的邊。你能幫助他嗎?例如,下面的樹 只需要放...

戰略遊戲 樹形DP入門)

題目鏈結 here 題目分析 放置哨兵無非兩種情況,放或不放,我們可以用dp i 1 來表示第i個結點放置哨兵,dp i 0 來表示第i個結點不放置哨兵,我們可以從上往下,從左往右來遍歷樹,所以這就用到了樹形dp的知識,我們很容易知道,如果父親結點沒放哨兵,那麼子結點肯定要放置哨兵,如果父親放置了哨...

動態規劃 樹形DP 題解 戰略遊戲

題意思路 woj 2532 戰略遊戲 洛谷p2016 戰略遊戲 這道題主要是看邊的情況。第一行 n,表示樹中結點的數目。第二行至第n 1行,每行描述每個結點資訊,依次為 該結點標號i,k 後面有k條邊與結點i相連 接下來k個數,分別是每條邊的另乙個結點標號r1,r2,rk。對於乙個n 0輸出檔案僅包...