原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. 问题转化成多个树求解,把答案乘起来即可. 现在我们考虑如何求一个树的答案. 再转化一下题意可以变成选出若干条长度至少为 2 的路径使得它们两两没有交. 标算十分优美.放到后面讲. 我先讲讲我的sb做法. 我们先来看看暴力 dp 怎么做: 设 dp[x][i] 表示子树 x ,在 x 节点上还有 i…
[BZOJ4784][ZJOI2017]仙人掌(Tarjan,动态规划) 题面 BZOJ 洛谷 题解 显然如果原图不是仙人掌就无解. 如果原图是仙人掌,显然就是把环上的边给去掉,变成若干森林连边成为仙人掌的方案数. 那么对于一棵树而言,考虑其变成仙人掌的方案数. 设\(a_i\)表示匹配\(i\)个儿子的方案数,显然转移时\(a_i=a_{i-1}+(i-1)*a_{i-2}\),即考虑新加入的儿子是匹配另外一个儿子还是不管. 设\(f_u\)表示节点\(u\)的子树匹配成仙人掌的方案数,这里要…
动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. 其实如果看过<背包九讲>或者看过笔者的文章<动态规划——背包问题>的读者会对树形dp有一定的了解,下面引用笔者在<动态规划——背包问题>中一个一段. “ 依赖背包问题的模型很简单,就是说对于某个物体,将它装入背包必须以装入一个物体做前提.这其实十分类似我们上文提到的分组背包…
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 //minamoto #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(…
终于是道中文题了.... 当时考试的时候就考的这道题.... 果断GG. 思路: 因为有可能存在依赖环,所以呢 先要tarjan一遍 来缩点. 随后就进行一遍树形DP就好了.. x表示当前的节点.j表示j的空间最多能放多少价值的软件. 状态转移方程:f[x][j]=max(f[x][j],f[x.son][k]+f[x][j-k]) 题目说:软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作 这句话怎么翻译呢? 直接把W[i]以下的价值设为负无穷不就好了嘛.. // by…
[HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2029  Solved: 811[Submit][Status][Discuss] Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是现在有个问题:软件之间存在依赖关系,即软件i只有在安装了软件j(包括软件j…
Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 Input 输入文件的第一行包含两个整数 n和p,含义如上所述. Output 输出文件中仅包含一个整数,表示计算1,2,⋯, ���的排列中, Magic排列的个数模 p的值. Sample Input 20 23 Sample Output 16 HINT 100%…
是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1}^{si[i*2]} \) 组合数用Lucas求 #include<iostream> #include<cstdio> using namespace std; long long n,p,f[5000005],jc[5000005],s[5000005]; long long ks…
题意: 给定一个仙人掌,边权为1 距离定义为两个点之间的最短路径 直径定义为距离最远的两个点的距离 求仙人掌直径 题解: 类比树形dp求直径. f[i]表示i向下最多多长 处理链的话,直接dp即可. 处理环的话,类似点双tarjan,把环上的点都拉出来. 先考虑拼接更新答案.断环成链复制一倍,为了保证最短路,答案必须只能是f[i]+f[j]+i-j (i-len/2<=j<i) 单调队列优化. 直接i-j即可,另一半的绕环会在复制后的那里处理. 然后更新f[x],直接找环上其他的元素,距离就是…
传送门 这图可以说是非常形象了2333 模拟赛的时候打了个表发现为一条链的时候答案是\(2^{n-2}\)竟然顺便过了第一个点 然后之后订正的时候强联通分量打错了调了一个上午 首先不难发现我们可以去掉所有在环上的边,那么就变成了一个森林,不同的树之间不可能有连边,那么只要所有树的答案乘起来就好了,只要在每一棵树内部树形\(dp\)即可 考虑对于\(u\),它的子树如何统计答案 我们强制子树必须得向外连一条边(显然最多只有一条),然后往上统计 如果子树里没有向外连边,每一棵子树的答案乘起来 如果向…