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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷P2016 战略游戏【树形dp】

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

P2016 戰(zhàn)略游戲
時間限制 1.00s
內(nèi)存限制 125.00MB

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

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

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

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

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

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

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

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

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

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

0

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

輸入輸出樣例
輸入 #1 復(fù)制
4
0 1 1
1 2 2 3
2 0
3 0
輸出 #1 復(fù)制
1

解題思路:
dp[u][1]dp[u][1]dp[u][1]來代表在uuu節(jié)點上放士兵所需要的最少士兵數(shù)
dp[u][0]dp[u][0]dp[u][0]代表不在uuu節(jié)點上放士兵所需要的最少士兵數(shù)
我們可知,若在uuu節(jié)點上放士兵,則
dp[u][1]=dp[u][1]+min(dp[v][1],dp[v][0])dp[u][1]=dp[u][1]+min(dp[v][1],dp[v][0])dp[u][1]=dp[u][1]+min(dp[v][1],dp[v][0])
若不在uuu節(jié)點放士兵,則其子節(jié)點一定需全部放士兵,因此
dp[u][0]=dp[u][0]+dp[v][1]dp[u][0]=dp[u][0]+dp[v][1]dp[u][0]=dp[u][0]+dp[v][1]

代碼:

#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstdlib> #include <cstring> #include <map> #include <stack> #include <queue> #include <vector> #include <bitset> #include <set> #include <utility> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; #define inf 0x3f3f3f3f #define rep(i,l,r) for(int i=l;i<=r;i++) #define lep(i,l,r) for(int i=l;i>=r;i--) #define ms(arr) memset(arr,0,sizeof(arr)) //priority_queue<int,vector<int> ,greater<int> >q; const int maxn = (int)1e5 + 5; const ll mod = 1e9+7; vector<int> m[1600]; int dp[1600][2]; int N; bool vis[1600]; void dfs(int s,int fa) {dp[s][1]=1;dp[s][0]=0;for(int i=0;i<m[s].size();i++) {if(m[s][i]==fa) continue;dfs(m[s][i],s);dp[s][1]+=min(dp[m[s][i]][0],dp[m[s][i]][1]);dp[s][0]+=dp[m[s][i]][1];}return; } int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);//ios::sync_with_stdio(0),cin.tie(0);scanf("%d",&N);rep(i,1,N) {int a,b,c;scanf("%d %d",&a,&b);rep(j,1,b) {scanf("%d",&c);m[a].push_back(c);}}dfs(0,-1);printf("%d\n",min(dp[0][1],dp[0][0]));return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

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

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