题意:给定一颗多叉树(<=20)的先序和后序遍历结果,求这种树共有多少。
题解:考虑产生相同先序遍历和后序遍历的两种树,S和T,他们每个相同结点对应的孩子数目应该相等,因为假如S某个结点有s个孩子,他们在先序和后序遍历中的顺序是一致的,要想两棵树先序遍历与后序遍历一致,则他们每一个结点的孩子都应该有这种特点。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 ll c[30][30]; 7 int n; 8 ll dfs(char s1[],char s2[]) 9 { 10 ll ans=1; 11 if(s1[0]==s2[0]) 12 return 1ll; 13 int i,j,k,cnt=0,len=strlen(s1); 14 for(i=1,j=0;i<len;) 15 { 16 k=1; 17 while(s1[i]!=s2[j]) 18 j++,k++; 19 cnt++; 20 char t1[30],t2[30]; 21 strncpy(t1,s1+i,k); 22 strncpy(t2,s2+j-k+1,k); 23 t1[k]=t2[k]='\0'; 24 ans*=dfs(t1,t2); 25 i+=k; 26 j++; 27 } 28 return ans*c[n][cnt]; 29 } 30 int main() 31 { 32 c[0][0]=1; 33 for(int i=1;i<=20;i++) 34 { 35 c[i][0]=c[i][i]=1; 36 for(int j=1;j<i;j++) 37 { 38 c[i][j]=c[i-1][j]+c[i-1][j-1]; 39 } 40 } 41 while(scanf("%d",&n),n) 42 { 43 char s1[30],s2[30]; 44 scanf("%s%s",s1,s2); 45 printf("%lld\n",dfs(s1,s2)); 46 } 47 return 0; 48 }