首页 > 代码库 > POJ 1240 Pre-Post-erous! 解题报告

POJ 1240 Pre-Post-erous! 解题报告

题意:

       给出一个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;}

  

POJ 1240 Pre-Post-erous! 解题报告