题意 给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配时多少,并且计算出有多少种最大匹配. N≤1000,其中40%的数据答案不超过 108 题解 显然的树形DP+高精. 这题是作为考试题考的,因为记得有一次考试,状态用两个数组存. 所以看到这题瞬间想到状态dp[i][0/1]代表以i为根的子树不选/选i点的最大匹配数. f[i][0/1]代表以i为根的子树中不选/选i形成最大匹配的方案数. 然后方程改了半天:而且极长所以看代码吧. TM还要加高精... (第一个点挂了,特判过的) #…
题目链接 luogu P1623 [CEOI2007]树的匹配Treasury 题解 f[i][0/1]表示当前位置没用/用了 转移暴力就可以了 code // luogu-judger-enable-o2 #include<vector> #include<cstdio> #include<cstring> #include<algorithm> using std::vector; using std::max; using std::min; inli…
类型:树形 DP 传送门:>Here< 题意:给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配是多少,并且计算出有多少种最大匹配. 解题思路 首先树形Dp是很明显的,$f[i][0]$表示$i$的子树中,$i$不参与匹配的最大匹配数,同样$f[i][1]$表示$i$参与匹配的最大匹配数.这样第一个子问题的答案就是$Max(f[1][0], f[1][1])$. 对于$f[i][0]$的转移很简单,既然$i$不参与匹配,那么$f[i][0]$就是它的每棵子树的最大匹配之和$$f[i][…
线段树的任意一棵子树都相当于节点数与该子树相同的线段树.于是假装在树形dp即可,记忆化搜索实现,有效状态数是logn级别的. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<map> using namespace std; #define…
题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) 由于空间卡的很紧,高精不仅要压位,还要动态开内存 由于有些状态是没用的,记忆化搜索以减少内存损失 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include…
根据最近做的几道树形dp题总结一下规律.(从这篇往前到洛谷 P1352 ) 这几道题都是在一颗树上,然后要让整棵树的节点或边 满足一种状态.然后点可以影响到相邻点的这种状态 然后求最小次数 那么要从两个维度来设计状态 第一个维度 (1)以i为根的树的所有节点都满足这种状态 (2)以i为根的树的只有i不满足这种状态 第二个维度 (1)i这个点取 (2)i这个点不取 所以就会有四种状态,不过最近几道题都是直接pass掉了其中一种 只有三种状态. 状态设计好了就很好写转移方程了,记住转移的过程中孩子一…
题目链接:https://vjudge.net/problem/POJ-3107 题意:求树的可能的重心,升序输出. 思路:因为学树形dp之前学过点分治了,而点分治的前提是求树的重心,所以这题就简单水了一下.用sz[u]记录子树u的大小,son[u]记录以u为根时,子结点中最大的结点数.所以: son[u]=max(son[v],n-sz[u]),前一部分son[v]好理解,对于n-sz[u],即结点u的父结点那一块的大小. AC code: #include<cstdio> #include…
Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严格2元树有三个,如下图: 给出n, d,编程数出深度为d的n元树数目. Input 仅包含两个整数n, d( 0   <   n   <   =   32,   0  < =   d  < = 16) Output 仅包含一个数,即深度为d的n元树的数目. Sample Input […
题目描述 输入 输出 样例输入 1 7 1 2 2 3 2 4 4 6 5 6 6 7 样例输出 3 题解 树形dp 设f[x]表示以x为根的子树完成路径覆盖,且x为某条路径的一端(可以向上延伸)的最小路径数,g[x]表示以x为根的子树完成路径覆盖,且x不为某条路径的一端的最小路径数. 那么考虑点x,只有三种情况:单独成路径.与一条子树的链成路径.与两条子树的链成路径. 这三种情况分别对应三种状态转移方程,具体见代码. 然而看到网上题解大把大把的贪心我也是醉了qaq #include <cstd…
设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=55,mod=1e8; int n,m; struct qwe { long long a[N]; void…