POJ 1463 树型DP

链接:

http://poj.org/problem?id=1463

题意:

求一棵树的最小点覆盖

题解:

dp[i][0]、dp[i][1]分别表示不在i结点上和在i结点上放置士兵时整个以i结点为根的子树被覆盖用到用到目标的最少数量

状态转移:

对叶子结点,有dp[i][0]=0,dp[i][1]=1  (也是递归的出口)

对非叶子结点,有

dp[i][0]=∑(dp[i][1])

dp[i][1]=∑(min(dp[j][0],dp[j][1]))+1  (j为i的子结点)

代码:

31 int a[MAXN];
32 int dp[MAXN][2];
33 VI G[MAXN];
34
35 void DP(int u) {
36     int dp0 = 0, dp1 = 0;
37     if (G[u].size() == 0) {
38         dp[u][1] = 1;
39         dp[u][0] = 0;
40         return;
41     }
42     rep(i, 0, G[u].size()) {
43         int v = G[u][i];
44         DP(v);
45         dp1 += min(dp[v][1], dp[v][0]);
46         dp0 += dp[v][1];
47     }
48     dp[u][1] = dp1 + 1;
49     dp[u][0] = dp0;
50 }
51
52 int main() {
53     int n;
54     while (cin >> n) {
55         memset(dp, 0, sizeof(dp));
56         rep(i, 0, MAXN) G[i].clear();
57         int root = -1;
58         rep(i, 0, n) {
59             int u, m;
60             scanf("%d:(%d)", &u, &m);
61             if (root == -1) root = u;
62             while (m--) {
63                 int v;
64                 scanf("%d", &v);
65                 G[u].pb(v);
66                 if (v == root) root = u;
67             }
68         }
69         DP(root);
70         cout << min(dp[root][0], dp[root][1]) << endl;
71     }
72     return 0;
73 }
时间: 2024-10-25 09:32:40

POJ 1463 树型DP的相关文章

POJ 1463 树状dp

Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 6629   Accepted: 3058 Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad

POJ 2486 树型dp 入门题

从根走k步获得的最大权值. 感觉情况不容易弄全.而步数从大到小有种背包的感觉. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> #include <iostream> #include <cstdlib> #include <string> #include <vect

【POJ 2486】 Apple Tree(树型dp)

[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Accepted: 2990 Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each

HDU_1520_Anniversary party_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8233    Accepted Submission(s): 3574 Problem Description There is going to b

HDU1561 The more, The Better(树型DP)

题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏. 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: dp[u][m]表示以u结点为根的子树攻克m个结点的最大价值 但是这样转移太难了,根是从每个孩子通过各自分配若干的城堡去攻克转移的,一个排列组合数,阶乘,是指数级的时间复杂度! 看了题解,原来这是依赖背包,没看背包九讲..不过网上的博客似乎没说清楚,事实上这个状态应该是三个维度来表示: dp[u][

POJ3659 Cell Phone Network(树上最小支配集:树型DP)

题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. 树上的每个结点作为其子树的根可以有三个状态: 不属于支配集且还没被支配 不属于支配集但被其孩子支配 属于支配集 那么就是用dp[u][1\2\3]来表示动归的状态. 123转移该怎么转移就怎么转移..最后的结果就是min(dp[root][2],dp[root][3]). 要注意的是对于有些结点前2

HDU_1561_The more, The Better_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7031    Accepted Submission(s): 4121 Problem Description ACboy很喜欢玩一种战略游戏,

二叉苹果树(树型DP+背包)

二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置.下面是一颗有4个树枝的树: 2   5 \  / 3  4 \  / 1 现在这颗树枝条太多了,需要剪枝.但是一些树枝上长有苹果. 给定需要保留的树枝数量,求出最多能留住多少苹果. 程序名:apple 输入格式: 第1行2个数,N和Q(1<=Q<= N,1<N<=

HDU_1011_Starship Troopers_树型dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16276    Accepted Submission(s): 4335 Problem Description You, the leader o