poj 3345(树形dp)

题意:一个人要买通若干支持者,这些支持者的关系形成一棵森林,只要买通树根他的孩子节点也会被买通,问你至少要买通m个守卫要花多少钱。

思路:由于是一颗森林我们需要加一个结点使得他到每个点都建一条边,然后dp[i][j]表示i为根的结点买通j个需要的最小花费。

dp[v][j]
= min(dp[v][j], dp[v][j-k] +
dp[x][k]);

代码如下:

 1 #include <cstdio>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <algorithm>
5 #include <set>
6 #include <iostream>
7 #include <queue>
8 #include <map>
9 #include <math.h>
10 #include <string>
11 #define MP(a, b) make_pair(a, b)
12 #define PB(a) push_back(a)
13 using namespace std;
14
15 const int LEN = 210;
16 const int INF = 0x3f3f3f3f;
17 int n, m, vex[LEN], dp[LEN][LEN], ind[LEN], top;
18 vector<int> Map[LEN];
19 map<string, int> mp;
20
21 int ch(string s){
22 if(!mp.count(s))mp[s] = top++;
23 return mp[s];
24 }
25
26 int dfs(int v, int fa){
27 int ret = 1;
28 dp[v][0] = 0;
29 for(int i=0; i<Map[v].size(); i++){
30 int x = Map[v][i];
31 if(x != fa){
32 ret += dfs(x, v);
33 for(int j=n; j>=0; j--){
34 for(int k=0; k<=j; k++){
35 dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]);
36 }
37 }
38 }
39 }
40 dp[v][ret] = min(dp[v][ret], vex[v]);
41 return ret;
42 }
43
44 int main()
45 {
46 freopen("in.txt", "r", stdin);
47
48 char buf[LEN], na[LEN], nb[LEN];
49 int tn, a, b;
50 while(scanf("%s", buf)!=EOF){
51 if(buf[0] == ‘#‘) break;
52 for(int i=0; i<LEN; i++) Map[i].clear();
53 memset(ind, 0, sizeof ind);
54 memset(dp, 0x3f, sizeof dp);
55 top = 1; mp.clear();vex[0] = INF;
56 sscanf(buf, "%d", &n);
57 scanf("%d", &m);
58 for(int i=0; i<n; i++){
59 scanf("%s%d", na, &tn);
60 a = ch(na); vex[a] = tn;
61 while(getchar() != ‘\n‘){
62 scanf("%s", nb);
63 b = ch(nb);
64 ind[b] ++;
65 Map[a].PB(b);
66 Map[b].PB(a);
67 }
68 }
69 for(int i=1; i<=n; i++){
70 if(ind[i]) continue;
71 Map[0].PB(i);
72 Map[i].PB(0);
73 }
74 dfs(0, -1);
75 int ans = INF;
76 for(int i=m; i<=n; i++){
77 ans = min(ans, dp[0][i]);
78 }
79 printf("%d\n", ans);
80 }
81 return 0;
82 }

时间: 2024-10-06 04:05:17

poj 3345(树形dp)的相关文章

poj 3342(树形dp)

题意:在一个公司中要举办一个聚会,每一个员工有一个奉献值.为了和谐规定直接上下级不能一起出席.让你找出奉献值之和最大为多少. 思路:dp[v][1]表示当前结点选,能获得的最大奉献值,dp[v][0]表示当前节点不选能获得的最大奉献值.状态转移: dp[v][0] = max(dp[v][0], ∑max(dp[x][1], dp[x][0]))x为直接儿子 dp[v][1] = max(dp[v][1], ∑dp[x][0] + vex[v]) 最后答案是max(dp[root][0], dp

poj 1947(树形dp)

题意:一棵树上问你最少切掉几条边使得能分割出一个结点数正好为k的子树. 思路:dp[i][j]表示以i为根切掉j个结点最少要几条边. dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]); 代码如下: 1 dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]); 2 } 3 } 4 } 5 } 6 } 7 return vex[v]; 8 } 9 10 int main() 11 { 12 // freopen("

POJ 2486 树形DP

有一颗苹果树,每个节点上面有很多苹果,从一个节点到另外一个可以到达的节点花费1步,求k步最多能吃到多少苹果,起始点为1,可以不回到起始点. 这是典型的回溯型树状dp. dp[i][j][0]代表以i为根节点的子树最多j步后回到i能吃到的最多的苹果, dp[i][j][1]代表以i为根节点的子树最多j步后不回到i节点最多能吃到的子树.那么状态转移就分三步了. (1)dp[i][j+2][0] = max(dp[i][j+2][0], dp[i][j-k][0]+dp[son][k][0]); (2

POJ 3342 树形DP入门题

题目意思和POJ2342一样,只是多加了一个条件,如果最大方案数唯一,输出Yes,不唯一输出No dp的是时候多加一个变量记录答案是否唯一即可 #include "stdio.h" #include "string.h" #include "vector" using namespace std; struct node { int fa; vector<int>child; }data[210]; struct comp { int

POJ 1947 树形DP入门题

给出N个点,N-1个关系,建出树形图,问最少减去几个边能得到节点数为P的树.典型树形DP题 dp[cur][j] :记录cur结点,要得到一棵j个节点的子树去掉的最少边数 转移方程用的背包的思想 对当前树的每一个子树进行计算 砍掉此子树:   dp[cur][j]=dp[cur][j]+1; 不砍掉:           for (l=0;l<=j;l++)  dp[cur][j]=Min(dp[cur][j],dp[cur][l]+dp[next][j-l]); 枚举从该树中留l个节点其他由新

POJ 2342 树形DP入门题

有一个大学的庆典晚会,想邀请一些在大学任职的人来参加,每个人有自己的搞笑值,但是现在遇到一个问题就是如果两个人之间有直接的上下级关系,那么他们中只能有一个来参加,求请来一部分人之后,搞笑值的最大是多少. 树形DP入门题. DP部分: dp[i][0]表示职员i不来参加party,以i为根的子树的最大搞笑值, dp[i][1]表示职员i来参加party,以i为根的子树的最大搞笑值. 转移方程: dp[cur][1]+=dp[next][0]; dp[cur][0]+=Max(dp[next][1]

Fire (poj 2152 树形dp)

Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同时花费为v[i].问最小花费. 以前做过一道类似的题(水库),这道题也差不多.首先来考虑,用\(best[i]\)表示以i为根的子树的最小花费.这样做有什么问题呢?它无法很好的处理消防站重复建的问题. 所以换一种做法.\(best[i]\)依然表示原来的含义,新建一个数组\(f[i][j]\),表示当i这个结

poj 1655 树形dp求取树的重心

http://poj.org/problem?id=1655 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or more trees. Define the balance of a node to be the size of the large

poj 2342(树形DP)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6062   Accepted: 3490 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure