D - Series-Parallel Networks
题意就不描述了
输入格式:
输入包含多组式布局,每组数据仅包含一个整数,即边数n(1<=n<=30)。输入结束标志为n=0。
输出格式:
对于每组数据,输出一行,即包含m条边的串并联网络的数目。
这是白皮书上117页的内容,其中给出了两个算法,第一个算法理解但是有点难实现,第二个算法是真心不懂(但是第二个算法代码确实很简单dp吧)
第一个算法:
把串并联网络看作一个树,因为每个串联网络一个分成多个并联网络或者单边 串联,并联网络可以分成
多个串联网络或者单边 并联。可以想想成一棵树的形式,假设刚开始有一个根是一个串连网络(并联网络),下一层全是并联网络(串联网络),就这样交替出现,当然每一棵树的最少得有两个儿子,如果这个棵数是个单边,那么他就是个叶子节点,没有儿子,这样问题就转化为了“共n个叶子,且每个非叶子节点至少有两个子节点”的树的数目f(n),再乘以2就是本题的答案。
即找出n个叶子的树有多少种。
因为题目中说串联在一起(并联在一起)的各个部分可以相互调换顺序,相当于每一层的树交换顺序后 属于同一种,所以我们只要保证从左到右节点数是递增或者递减的就可以了。
假设对于5个叶子的节点,子树可以分为
1 1 1 1 1
1 1 1 2
1 1 3
1 4
1 2 2
2 3
把每种的情况全加起来即可
对于24个叶子的树:
2 10 12 的情况共有 f ( 2 ) ∗ f ( 10 ) ∗ f ( 12 ) f(2)*f(10)*f(12) f(2)∗f(10)∗f(12)种方法
对于 6 6 6有多少种方法吗?难道是 f ( 6 ) ∗ f ( 6 ) ∗ f ( 6 ) f(6)*f(6)*f(6) f(6)∗f(6)∗f