日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 2016 战略游戏(树形DP)

發(fā)布時間:2023/12/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 2016 战略游戏(树形DP) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述

Bob喜歡玩電腦游戲,特別是戰(zhàn)略游戲。但是他經(jīng)常無法找到快速玩過游戲的辦法?,F(xiàn)在他有個問題。

他要建立一個古城堡,城堡中的路形成一棵樹。他要在這棵樹的結(jié)點上放置最少數(shù)目的士兵,使得這些士兵能了望到所有的路。

注意,某個士兵在一個結(jié)點上時,與該結(jié)點相連的所有邊將都可以被了望到。

請你編一程序,給定一樹,幫Bob計算出他需要放置最少的士兵.

輸入格式

第一行 N,表示樹中結(jié)點的數(shù)目。

第二行至第N+1行,每行描述每個結(jié)點信息,依次為:該結(jié)點標(biāo)號i,k(后面有k條邊與結(jié)點I相連)。

接下來k個數(shù),分別是每條邊的另一個結(jié)點標(biāo)號r1,r2,...,rk。

對于一個n(0<n<=1500)個結(jié)點的樹,結(jié)點標(biāo)號在0到n-1之間,在輸入數(shù)據(jù)中每條邊只出現(xiàn)一次。

輸出格式

輸出文件僅包含一個數(shù),為所求的最少的士兵數(shù)目。

例如,對于如下圖所示的樹:

2 / 0---1\3

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

輸入輸出樣例

輸入 #1復(fù)制

4 0 1 1 1 2 2 3 2 0 3 0

輸出 #1復(fù)制

1

【分析】

題目相當(dāng)于需要求覆蓋這顆樹需要的最小點數(shù)

用???表示在這棵樹中,以?ii?為根節(jié)點的子樹選/不選根節(jié)點的情況下,覆蓋這棵樹所有邊需要的最小點數(shù)

所以,當(dāng)不選這個節(jié)點?ii?時,則所有 以其子節(jié)點為根節(jié)點的子樹 都必選根節(jié)點

當(dāng)選擇這個節(jié)點?ii?時,它能連接到所有的子節(jié)點,所以 以其子節(jié)點為根節(jié)點的子樹 可以選則其根節(jié)點,也可以不選

歸納成方程組,可能更容易理解:

其中,Son_iSoni??為?ii?的子節(jié)點集合

顯然,邊界為

如果定義?時

遞推式及其邊界便能寫在一起了:

答案看了以上大牛的解析

#include<iostream> #include<algorithm> #include<queue> #include<cstring> using namespace std; vector <int> edge[1510]; int dp[2][1510],n,x,y,sum[1510],z; void solve(int u,int fa) {for(int i=0;i<edge[u].size();i++){int v=edge[u][i];if(v==fa)continue;solve(v,u);dp[0][u]+=dp[1][v];dp[1][u]+=min(dp[1][v],dp[0][v]);}dp[1][u]++; } int main() {cin>>n;for(int i=1;i<=n;i++){cin>>x>>sum[x];for(int i=1;i<=sum[x];i++){cin>>z;edge[x].push_back(z);edge[z].push_back(x);}}solve(0,0);int ans=min(dp[0][0],dp[1][0]);cout<<ans;return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的洛谷 2016 战略游戏(树形DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。