摘要: 题意:有一颗苹果树,每个节点上有一些苹果,任何两个节点之间的距离都为1,每走一步距离都增加1,无论该边有没有被走过。问,在最多走k步的情况下,最多能吃到多少个苹果。解法:设d[x][i][0]表示在以x为根的树上,最多走i步,并且最终回到节点x所能吃到的最多的苹果数。 设d[x][i][1]表示在以x为根的树上,最多走i步,并且最终不需要回到节点x所能吃到的最多的苹果数。注意到,一定有d[x][i][1] >= d[x][i][0]。 易得d[x][i][0] = max(d[x][i][0], d[x][i-j-2][0] + d[y][j][0]),其中y为所有x的子节点。 ... 阅读全文
posted @ 2013-11-23 23:13 Plumrain 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 题意:给一棵含有n个节点的树,问最少切割多少条边,能够得到一棵恰好包含p个节点的子树。解法:设d[x][i]表示以x为根的子树,切割出含有i个节点的子树最少需要切割多少条边。对于每个子节点y,可以直接将其切掉,也可以对以y为根的树进行切割,然后给以x为根的树增加节点数。这个地方其实就是一个背包,好好体会。 状态转移方程为d[x][i] = max(d[x][i]+1, d[x][i-j] + d[y][j])。 注意枚举的时候要逆序,否则要多开一维数组。tag:树形dp, 背包 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-1... 阅读全文
posted @ 2013-11-23 23:00 Plumrain 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 题意:一只蜗牛,它的房子在树上的某个叶子节点上,它要从树的根节点出发,寻找自己的房子。树的任意两个节点的距离为1,房子出现在每个叶子节点上的可能性一样。有的节点上有虫子,如果有虫子,虫子会告诉蜗牛它的房子是不是在这个节点为根的子树上。求蜗牛所走距离的最小期望。 如下图,如果蜗牛制定的策略先到2,再到5再到4,则由于房子地点的不确定,所以可能走的距离为1,4,6,所以期望为11/3。如果制定的策略是先到3,根据虫子的话判断去4和5还是去2,则可能走的距离为2,4,3,所以期望为9/3 = 3。可以证明,最小的期望即为3。解法:首先,设叶子节点总数为tt,则肯定会有tt种情况,所以只需要求出所.. 阅读全文
posted @ 2013-11-23 22:45 Plumrain 阅读(553) 评论(0) 推荐(1) 编辑
摘要: 我果然是题短了就能做得好- -。Div 2的三道题都短,于是迅速的过掉了250和500,rating涨了150^ ^。Div 2 250pt题意:给一个vector A,对其中任意的数x,可以将其变为2^t * x(t为正整数),判断能不能将A变为所有数全部一样。解法:我的方法是,将A排序,对第i个,while(A[i] 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 23 using namesp 阅读全文
posted @ 2013-11-23 01:26 Plumrain 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 题意:如下图所示,给出n*m的网格,其中P表示能放炮兵,H表示不能放,每只炮兵的射程如图涂黑部分。在防止误伤的前提下(任何一个炮兵不在其他炮兵的射程内),问最多能拜访多少炮兵。(n 7 #include 8 #include 9 #include 10 11 using namespace std; 12 13 #define CLR(x) memset(x, 0, sizeof(x)) 14 #define PB push_back 15 16 int n, m, sz; 17 bool a[200][20]; 18 int d[105][70][70]; 19 vect... 阅读全文
posted @ 2013-11-23 00:46 Plumrain 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 题意:用1*2的瓷砖拼出m*n的矩形。问有多少种拼法。解法:设d[i][j]表示第i行状态为j的情况下,最多能有多少种拼法,对于状态j,1表示为竖着放置的瓷砖且它横跨i和i+1两行,其余皆用0表示。d[i][j] += d[i-1][k],其中k表示能转移到j的状态。tag:状压dp 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-11-19 01:01 4 * File Name: DP-POJ-2411.cpp 5 */ 6 #include 7 #include 8 #include 9 #include 10 11 u... 阅读全文
posted @ 2013-11-23 00:31 Plumrain 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 题意:在m*n的矩阵上,1表示能放牛,0表示不能放。要求放的牛不能相邻(上下相邻或者左右相领),问放牛的方法种数。解法:设d[i][j]表示第i行状态为j的情况下,能放的牛的数量。d[i][j] += d[i-1][k],其中k表示能转移到j的状态,num(j)表示状态为j的行所放的牛的数量。当然,还要判断一下状态j是不是能放在第i行。tag:状压dp 1 /* 2 * Author: Plumrain 3 * Created Time: 2013-11-18 23:37 4 * File Name: DP-POJ-3254.cpp 5 */ 6 #include 7 #incl... 阅读全文
posted @ 2013-11-23 00:22 Plumrain 阅读(322) 评论(0) 推荐(0) 编辑