HDU 1011(星河战队 树形DP)
題意是說在一個洞穴中有許多房間,每個房間中有一些蟲子和大腦,這些房間之間用隧道相連形成一棵樹,士兵們殺蟲子的能力有限,也可以直接殺死蟲子而不消耗士兵戰斗力,但這樣就無法得到房間中的大腦,士兵們不能走回頭路,問給定士兵數量時能得到的大腦最大值。
在樹上進行動態規劃,對于每個節點來說,選擇了它,就要損失士兵戰斗力,不選擇它,就可以將這些省下來的士兵戰斗力用在后面的房間中,后面的房間將最優選擇傳遞到當前位置,以此來判斷從而得到最優解。
轉移方程:dp[ i ][ j ] = max(dp[ i ][ j ], dp[ i ][ j-k ]+dp[ son(i) ][ k ])
dp[ i ][ j ] 表示以節點 i 為根節點時消耗 j 個士兵所能得到的最大大腦數。
開始的時候直接將每個士兵按戰斗力分成每個戰斗力為 1 的士兵,也就是說將士兵數量乘以 20 ,企圖直接可以用士兵數和蟲子數進行加減運算,但是這樣很明顯是錯誤的,因為如果一個房間中的蟲子數模 20 不為零,也就是說并不能完全發揮一個士兵的戰斗力時,要取到這個房間的大腦,就需要再消耗一個士兵,即士兵戰斗力并不等于士兵手中的子彈數(這樣說好像更復雜了,意思就是每個士兵不一定會殺滿 20 只蟲子)。
還有一點就是士兵數是可以為零的,但是必須要有人進去才能得到大腦,無論里面是否有蟲子。
代碼如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 110; 4 int N,M; 5 struct Node 6 { 7 int enemy,aim; 8 }node[MAXN];//存儲所有節點上的信息 9 int dp[MAXN][MAXN];//dp[i][j]表示根節點為 i 時,用掉 j 個士兵獲得的最大值 10 int mp[MAXN][MAXN];//存圖,mp[i][0]表示與節點 i 相連的邊的數目 11 bool vis[MAXN];//記錄節點的訪問情況 12 void dfs(int root) 13 { 14 vis[root] = true; 15 int num = (node[root].enemy+19)/20;//獲得當前節點需要的士兵數目 16 for(int i = num; i <= M; i++) dp[root][i] = node[root].aim; 17 for(int i = 1; i <= mp[root][0]; i++)//開始遍歷與根節點相連的子節點 18 { 19 int u = mp[root][i]; 20 if(vis[u]) continue; 21 dfs(u); 22 for(int j = M; j >= num; j--) 23 for(int k = 1; j+k <= M; k++) 24 if(dp[u][k])//判斷是否應該取當前節點 u 25 dp[root][j+k] = max(dp[root][j+k],dp[root][j]+dp[u][k]); 26 } 27 } 28 int main() 29 { 30 int a,b; 31 while(scanf("%d%d",&N,&M)) 32 { 33 if(N == -1 && M == -1) break; 34 memset(vis,0,sizeof(vis)); 35 memset(dp,0,sizeof(dp)); 36 memset(mp,0,sizeof(mp)); 37 for(int i = 1; i <= N; i++) 38 scanf("%d%d",&node[i].enemy,&node[i].aim); 39 for(int i = 1; i < N; i++) 40 { 41 scanf("%d%d",&a,&b); 42 mp[a][0]++; 43 mp[b][0]++; 44 mp[a][mp[a][0]] = b; 45 mp[b][mp[b][0]] = a; 46 } 47 if(M==0) puts("0");//有可能己方沒有士兵,但要求至少要有人進去 48 else 49 { 50 dfs(1); 51 printf("%d\n",dp[1][M]); 52 } 53 54 } 55 return 0; 56 } View Code這道題還是借鑒了很多大佬的博客才做出來的,感謝這些大佬的分享 ^_^
轉載于:https://www.cnblogs.com/Taskr212/p/9516466.html
總結
以上是生活随笔為你收集整理的HDU 1011(星河战队 树形DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年施工升降机司机模拟考试题库-百
- 下一篇: 如何把jpg图片批量转为mp4视频