题目:http://poj.org/problem?id=1240
题目的意思即,给定一棵m元树的前序和后序遍历,问你一共有多少颗m元树有这样的性质。
乍一看好像没什么头绪,由于题目中也提到了由中序和后序求前序,想到是不是同样能用分治法。
我们知道前序遍历的开头是这棵树的树根,其余部分是子树,如果用f(m, tree)来表示根据m元tree的前序和后序遍历能构造出多少种树,设子树有n棵,则
f(m, tree) = f(m, subtree(1)) * f(m, subtree(2)) * ... * f(m, subtree(n)) * C(m, n)
子树种类相乘是根据组合数学的乘法公式,最后乘以C(m, n)则是因为m元中选择n个位置依次放入subtree(1), subtree(2), ..., subtree(n),都能保证同样的遍历结果。
边界条件即单节点树只有一种。
#include <iostream>
#include <string>
using namespace std;
typedef long long LL