标签:
题意:
给出一个m叉树的前,后序遍历求这样的树有多少种。
Solution:
我们知道前序遍历的第一个点一定是根节点,后序遍历的最后一个点一定是根节点。
由此,我们只一要确定对于每一个节点,它有多少个儿子节点,再累乘C(m,k)。
code
#include <iostream> #include <algorithm> #include <string> using namespace std; string sq, sh; int len, ans,m; int Combination (int n, int m) { int ans = 1; for (int i = 1; i <= m; i++) ans = ans * (n - i + 1) / i; return ans; } void make (int l, int r, int t, int w) { if (l > r || t > w) return; int p = 0, i = 0; while (l <= r) { char s = sq[l]; for (i = 0; i < len; i++) if (sh[i] == s) break; int k = w - i+1; make (l+1, l+k-1, i+1, w); l = l + k; w=i-1; p++; } ans*=Combination(m,p); } int main() { while (cin >>m>> sq >> sh) { len = (int) sq.size() - 1; ans=1; reverse (sh.begin(), sh.end() ); make (1, len, 1, len); cout<<ans<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/keam37/p/3871107.html