摘要: 题意跟hdu1520一样,给定一棵树,要求选出若干个点,但如果选择了父节点跟儿子节点不可以同时选。。求可以选出的节点数的最大值,同时,判断该选法是否唯一;分析:前半部分很容易实现,普通的树形dp,关键是如何判断是否唯一。我们用flag[N][2]来记录每一个节点的情况flag[i][j]为真,表示唯一则可以这样判断对于叶子结点, flag[k][0] = flag[k][1] = 1.对于非叶子结点,对于i的任一儿子j,若(dp[j][0] > dp[j][1] 且 flag[j][0] == 0) 或 (dp[j][0] < dp[j][1] 且 flag[j][1] == 0) 阅读全文
posted @ 2012-03-07 23:12 枕边梦 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N个国家,相互之间可能存在附属关系,现在想要贿赂m个国家,已知,贿赂一个国家,那么如果该国家拥有附属国,那么他的所有附属国都可以算作已经贿赂。分析:按照国家之间的附属关系连边(有向),之后将森林转为一棵树,就变成了一棵树上的01背包了。因为国家是用名字给出的,先用字典树给名字编号……dp[i][j]表示第i个国家及其附属国中选j个国家的最小花费之前一直过不了的题,现在居然1A了,主要是思路比较清晰View Code #include<iostream>#include<algorithm>#include<string.h>#include< 阅读全文
posted @ 2012-03-07 21:37 枕边梦 阅读(508) 评论(0) 推荐(0) 编辑
摘要: 题意:在一棵树上,找出一个节点,使得每一个节点到达该点的距离(权值*路径长度)和最短。分析:先dfs求出每一个节点到根节点的距离和,然后再一次深搜即可。交了之后悲剧的爆栈了,递归太是太深了,所以,开挂了,哈View Code #include<iostream>#include<algorithm>#include<vector>using namespace std;const int N = 100010;#pragma comment(linker, "/STACK:1024000000,1024000000") //开挂了,嘿嘿s 阅读全文
posted @ 2012-03-07 16:36 枕边梦 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,从1号顶点进入树中,每次可以分配人到其他可达的顶点去,杀死所有的bugs可以获取brain值,求出m个人最多能获取多少brain值。分析:树形DP,需要注意的有俩点:1)只有通过父节点才可能到达儿子节点,而且,通过父亲节点必须满足人数足够消灭该节点上的所有bugs2)对于每一棵子树而言,至少要有一个人才可能获得该子树上的brain,即使没有bugs用dp[i][j]表示派遣j个人到达以i为根的子树所能获得的最大brain值View Code #include<iostream>#include<algorithm>#include<string& 阅读全文
posted @ 2012-03-07 14:11 枕边梦 阅读(633) 评论(1) 推荐(1) 编辑
摘要: 题意:给定一棵树,每条边都有各自的权值,要求用K个机器人(从根出发),遍历整棵数,求最小总权值分析:一开始很清楚的知道,还是一道树形背包,用dp[i][j]表示以节点i为根的子树选了j个机器人遍历的权值和。关键在j==0 时的意义的理解,一开始总处理不好,就是dp[i][0]表示的是以i为根的子树放置一个机器人遍历完子树之后又回到iView Code #include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;const int 阅读全文
posted @ 2012-03-07 08:21 枕边梦 阅读(244) 评论(0) 推荐(0) 编辑