COJ 1351 Tree Counting 动态规划】的更多相关文章

题目大意是: 给定一个n,k,表示树上共有n个节点,每个节点最多有k个叶子,问一共多少种摆法,答案对1000000007取模 这里定义一个dp[i]表示 i 个节点对应有多少种方法 f[i][j] 表示一个除去顶点的树中,这个顶点延伸出 j 个子树 , 这j个子树中共有i 个点 那么只要在f[i][j]上添加一个顶点就得到了 dp[i] 所以dp[i+1] = f[i][0] + f[i][1] ......+f[i][k] f[i][j] = ∑(f[i-k][j-1]*dp[k]) k<=i…
原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1351 DP题,毫无疑问.由于动态规划题目做得少.不熟悉,刚开始自己用f[i]表示用 i 个节点的方案数,然后就需要逐个子节点进行深搜,非常暴力,毫无疑问TLE.在此情况下,直觉告诉我需要增加一维空间来降低时间复杂度.此时,设dp[i][j]表示用 i 个节点,孩子节点数恰好为 j 的方案数,那么,状态转移方程为: #include <stdio.h> #include <str…
这是一个动态规划的题: 当初想到要用dp,但是一直想不到状态转移的方程: 题解上的原话: 动态规划,设 g[i]表示总结点数为 i 的方案种数,另设 f[i][j]表示各个孩子的总结点数为i,孩子的个数为 j 的方案数,那么有 g[i+1]=f[i][1]+f[i][2]+...+f[i][k],相当于添加一个根节点之后变成完整的树,同时要把有 1 个孩子,2个孩子, ……,k 个孩子的情况都考虑进去.对于 f[i][j]的求解可以用类似背包的方法去做,在求解的时候也会用到 g[1], g[2]…
[题目]H. Ember and Storm's Tree Game [题意]Zsnuoの博客 [算法]动态规划+排列组合 [题解]题目本身其实并不难,但是大量干扰因素让题目显得很神秘. 参考:Zsnuoの博客 一.首先Ember必胜(考虑n个点连成一条链),故合法的树一定满足先手必胜.当Storm选择的链满足单调或单峰时,每一条链对答案贡献两对(i,op). 解释:单调时,考虑翻转最后一个数和从第二个数开始取负两种操作.单峰时,上凸考虑翻转顶峰和顶峰右侧的数,下凸考虑取负顶峰和顶峰右侧的数.…
Tree Cutting 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T with n vertices conveniently labeled with 1,2,...,n. Each vertex of the tree has an integer value vi. The value of a non-empty tree T is equal to v1⊕v…
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include <cstdio> #define F(i,j,k) for (int i=j;i<=k;++i) int main() { int n,m,a; scanf("%d",&n); a=0; m=n+1; F(i,0,30) a+=(m>>i)&1; pr…
问题: 4个标记为1,2,3,4的节点构成自由树(算法导论里的定义,连接着,无环,无向的图),一共有多少种构造方法?如果N个节点呢? 解决方法: 4个节点可以通过穷举的方式得到答案,一共有16中方式. 第一类构造方式,取一个节点做中心,剩余三个节点与其相连,一共4种(每个节点做一次中心). 第二类构造方式,四个节点连成一条线,可以看成个排列,第一个有4种取法,第二个有3种,依次类推.但是因为例如1234与4321结构上是一样的, 所以总的排列数除以2才是总共的构造数,即 $\frac{4!}{2…
Bessie was poking around the ant hill one day watching the ants march to and fro while gathering food. She realized that many of the ants were siblings, indistinguishable from one another. She also realized the sometimes only one ant would go for foo…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题目大意是给了n个结点,让后让构成一个树,假设每个节点的度为r1, r2, ...rn,求f(x1)+f(x2)+...+f(xn)的最大值. 首先由于是树,所以有n-1条边,然后每条边连接两个节点,所以总的度数应该为2(n-1). 此外每个结点至少应该有一个度. 所以r1+r2+...rn = 2n-2.ri >= 1; 首先想到让ri >= 1这个条件消失: 令xi = ri,则x1+x…
传送门. 题解: 最主要的问题是如何判断一个数是否合法,这就需要发现性质了. 这个状态划分还是不太容易想到, 每次加的数\(∈[0,k)\),也就是个位一直在变变变,更高的位每次都是加一,这启发我们状态的划分. 这个时候可以利用数位dp的逐位确定思想,在尝试后,发现可以从高位到低位,因为当高位确定后,高位就不会变了,那么高位的最大值也就确定了. 设\(f[i][p][a]\),\(i\)含义如上,\(i+1\)位后的最大值是p,\(2-i\)位是0,当前个位是\(a\),使第\(i\)位加1后个…