Uva--1218(树形动规,多状态)
2014-08-28 23:16:47
(这题图抠不下来,也是醉了-。-),题目链接
思路:典型的树形DP,小白书例题,状态有点多,所以第二维要开三个状态,dp[N][3]。
(1)dp[u][0] 表示 u 是服务器,以 u 为根的子树最优解。
(2)dp[u][1] 表示 u 不是服务器,但 u 的父节点是服务器,以 u 为根的子树的最优解。
(3)dp[u][2] 表示 u 和 u 的父节点都不是服务器,以 u 为根的子树的最优解。
状态转移:dp[u][0] = sum{min(dp[son of u][0] , dp[son of u][1])} + 1;
dp[u][1] = sum{dp[son of u][2]};
dp[u][2] = min(dp[u][1] - dp[son of u][2] + dp[son of u][0]);(因为 u 和 u的父节点都不是服务器的话,u 的子节点一定要有且仅有一个服务器,所以若第 k 个子节点为服务器,那么其他子节点(除了k)都得不是服务器,所以要枚举 k,取最小值。这里的小技巧是:由于 u 不是服务器,所以所有子节点都不是服务器的解是 sum(dp[son][2]) 恰好等于dp[u][1],这样就可以利用dp[u][1]了,使复杂度讲了一次方)
1 /************************************************************************* 2 > File Name: 1218.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Thu 28 Aug 2014 05:19:01 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 const int INF = 1 << 29; 17 18 int N; 19 int dp[100005][3]; 20 vector<int> ver[100005]; 21 22 //dp[u][0] : u is a server 23 //dp[u][1] : u is not a server,but father of u is. 24 //dp[u][2] : both u ans its father is not servers 25 26 void Dp(int u){ 27 int len = ver[u].size(); 28 int v; 29 dp[u][0] = 1; 30 dp[u][2] = 1; 31 if(!len) return; 32 for(unsigned int i = 0; i < len; ++i){ 33 v = ver[u][i]; 34 Dp(v); 35 dp[u][0] += min(dp[v][0],dp[v][1]); 36 dp[u][1] += dp[v][2]; 37 } 38 dp[u][2] = INF; 39 for(unsigned int i = 0; i < len; ++i){ 40 v = ver[u][i]; 41 dp[u][2] = min(dp[u][2],dp[u][1] - dp[v][2] + dp[v][0]); 42 } 43 } 44 45 void Init(){ 46 for(int i = 1; i <= N; ++i) 47 ver[i].clear(); 48 memset(dp,0,sizeof(dp)); 49 } 50 51 int main(){ 52 int a,b; 53 while(scanf("%d",&N) == 1){ 54 Init(); 55 for(int i = 1; i < N; ++i){ 56 scanf("%d%d",&a,&b); 57 ver[a].push_back(b); 58 } 59 Dp(1); 60 printf("%d\n",min(dp[1][0],dp[1][2])); 61 scanf("%d",&a); 62 if(a == -1) break; 63 } 64 return 0; 65 }

浙公网安备 33010602011771号