动态规划_树形dp
TouchDreamer
这个作者很懒,什么都没留下…
展开
-
POJ 1655 Balancing Act
题目分析 本题就是求每个节点的最小balance,如果有多个节点有相同的balance,那么输出最小的一个。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 2e4+5;const int INF = 0x3f3原创 2016-08-03 16:37:27 · 258 阅读 · 0 评论 -
POJ 3071 FootBall 概率dp
题目分析 这道题其实就是全概率公式的应用,可以定义状态为ans[i][j],其表示第j个队在第i轮胜出的概率,这样的话状态转移方程就很好写了。 ans[i][j]=∑ans[i−1][j]∗ans[i−1][k]∗a[j][k];ans[i][j] = \sum ans[i-1][j]*ans[i-1][k]*a[j][k]; 比如8个队,用2进制表示为 000, 001,010,0原创 2017-01-10 16:31:52 · 234 阅读 · 0 评论 -
POJ 2486 Apple Tree(树形dp)
题目大意 这道题的意思就是从根节点开始走k步能得到的最大价值。题目分析 树形dp。首先很容易就可以想到用dp[root][k]表示以root为根的子树中最多走k时所能获得的最多苹果数,接下去我们很习惯地会想到将k步在root的所有子结点中分配,也就是进行一次背包,就可以得出此时状态的最优解了,但是这里还有一个问题,那就是在进行背包的时候,对于某个孩子son走完之后是否回到根结点会对后面是否原创 2016-09-12 21:09:29 · 327 阅读 · 0 评论 -
BestCoder Round #65
HDU 5590 ZYB’s Biology (水题)#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 105;char s1[maxn],s2[maxn];int main(){ int T,N; sc原创 2016-08-06 15:05:24 · 221 阅读 · 0 评论 -
HDU 5148 Cities
题目分析 非常好的一道题,这道题同样是求树上的期望问题,也就是每个边被使用的次数乘以 每个边的权值,再除以K*K/2(因为这道题可能会抽到相同的点)因为最后还需要乘以K*K那么这样一化简很明显就是最终得到的结果乘以2就可以了,对于每条边而要,如果左选中n个顶点,右边选中m个顶点,那么很明显,这条边所做的贡献为n*m次。我们对于dp[i][j]表示以i为根节点的子树中选取j个顶点得到的最小的期望值原创 2016-08-05 17:16:39 · 300 阅读 · 0 评论 -
HDU 5723 Abandoned country
题目分析 题目不难,但是注意的点比较多,首先就是写最小生成树算法,这个很简单,我也不用多说了,我要说的就是求期望的问题,我们可以这样求,对于每条边来说,它用到的次数等于这条边左边节点数乘以右边节点数,其实就是乘法原理。然后我们将用到的次数再乘以这条边的权值其实就是这条边对期望所做的贡献,那么在递归的工程中我们可以求出这个值,然后再将这个值除以n*(n-1)/2就可以得到期望了。#include原创 2016-08-05 14:37:47 · 342 阅读 · 0 评论 -
HDU 3586 Information Disturbing
题目分析 这道题wa了不知道多少次,状态转移方程非常好写,但是调bug调了一上午。首先我将程序中的INF设置的过大,导致了加的过程中爆INT,这个潜伏的bug找了好几个小时,真是蠢!!这道题主要思想是利用2分的思想,对于power limit进行2分搜索即可,同时需要注意有可能找不到值,那么需要特判输出-1.最初的时候忘了还有可能有这种情况了,别的就比较简单了,看了一下,这道题时那场多校比赛中可原创 2016-08-05 11:10:10 · 317 阅读 · 0 评论 -
HDU 2196 Computer(树形DP)
题目分析 这道题好难想呀!!看了别人的题解继续想还是想不明白,主要是自己的一个点没有过来,题解是先求出每个节点到叶子节点的最长路以及次长路用dp[u][0]和dp[u][1]表示,然后再用一遍dfs求每个节点到经过其父亲节点出发的另一条最长路,状态转移方程是这样的,如果这个节点在其父亲节点的最长路上,那么这个节点经过其父亲节点的最长路我们用dp[son][2]表示,则dp[u][2]=max(d原创 2016-08-04 20:10:52 · 210 阅读 · 0 评论 -
树形dp基础题
树形dp基础题 该dp的实质就是利用树的性质,儿子节点返回的值可以被父亲节点加以利用以及处理,这样就构成了一种在树结构上的动态规划,简称树形dp。从昨天开始决定刷树形dp专题,刷了4道水题,因此想写一个博客总结一下。POJ 1463 Strategic game 这道题就是在树上的节点添加守卫,很明显我们可以得出以下结论,如果父亲节点不添加守卫,那么儿子节点一定要添加守卫,如果父亲节点添加原创 2016-08-03 14:31:14 · 416 阅读 · 0 评论 -
POJ 1947 Rebuilding roads
POJ 1947 Rebuilding roads 树形dp经典题目,没做过此类题,想了好半天,用到了分组背包的思想,注释写的很清楚,因此就不多讲了。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 155;co原创 2016-08-03 16:12:03 · 348 阅读 · 0 评论 -
lightOJ 1382 The Queue
题目分析 具体看代码吧,树形dp的思想,dp[i]表示父节点下面所有子树节点合理排列的方法数。。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1005;const int mod = 1e9+7;#defi原创 2017-01-10 20:28:59 · 266 阅读 · 0 评论