因为涉及m叉树数,所以如果这个节点有n棵子树,就需要$C_{m}^{n}$
由于$C_{m}^{n}=C_{m-1}^{n}+C{m-1}^{n-1}$
void choice(){
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++){
if(j==0) c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
}
有点小难这道题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=25;
int m,c[N][N];//c[i][j]代表从i个数中选j个
string vpre,vpos;
void choice(){
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++){
if(j==0) c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
}
int dfs(string pre,string pos){
int sum=1,cnt=0;
pre.erase(pre.begin());
pos.erase(pos.end()-1);
for(int i=0,j=0;i<pre.size();){
while(pos[j]!=pre[i]) j++;
sum*=dfs(pre.substr(i,j-i+1),pos.substr(i,j-i+1));
cnt++;
i=++j;
}
return sum*c[m][cnt];
}
int main(){
choice();
while(cin>>m>>vpre>>vpos){
cout<<dfs(vpre,vpos)<<endl;
}
return 0;
}