poj 1240 Pre-Post-erous!

来源:互联网 发布:淘宝网店转让怎么转 编辑:程序博客网 时间:2024/05/17 22:39

题目链接:http://poj.org/problem?id=1240

题目大意:给定一棵K叉树的先序遍历和后序遍历,问有多少种这样的树。因为字符串的每个字符都是不同的,所以可以确定一个根节点下有几个儿子和每棵子树所在的区间。用递归实现即可。

#include<stdio.h>#include<string.h>#include<string>using namespace std;int c[22][22];int m;char str1[30],str2[30];void init(){int i,j;for(i=0;i<22;i++)c[i][0]=1;for(i=0;i<22;i++)c[i][i]=1;for(i=1;i<22;i++)for(j=1;j<i;j++){c[i][j]=c[i-1][j-1]+c[i-1][j];//printf(" i %d j %d c%d\n",i,j,c[i][j]);}}int dfs(int st1,int ed1,int st2,int ed2){//printf("co\n");int tmp,i;int rec=1;int num=0;if(ed1-st1==-1)return 1;while(st1<=ed1){for(i=st2;i<=ed2;i++){if(str2[i]==str1[st1]){tmp=i;num++;break;}}//printf("st1 %d ed1 %d tmp %d \n",st1,ed1,tmp);rec*=dfs(st1+1,st1+tmp-st2,st2,tmp-1);st1=st1+tmp-st2+1;st2=tmp+1;}return rec*c[m][num];}int main(){init();int len;int rec;while(scanf("%d",&m),m){scanf("%s%s",str1,str2);len=strlen(str1);//printf("a");rec=dfs(1,len-1,0,len-2);//printf("kkkk\n");printf("%d\n",rec);}return 0;}


 

原创粉丝点击