zoj 1500 Pre-Post-erous!

題意:一個k叉樹,給定其前序和後序遍歷,問其中序遍歷方式有多少種。

思路:給定前序和中序無法唯一的確定一棵k叉樹,但是每一個結點所在的深度

      卻是唯一的。本題可用遞歸進行計算。每次遞歸獲得每層結點分佈的可能性。

      舉例 :13 abejkcfghid jkebfghicda

     

     顯然a,b容易確定,由後序知 j,k,e必定爲 b 的後代。對 j,k,e 遞歸可獲得j,k,e的位置關係。同理其它元素都可以確定自己所在的層數。

     對於每一層,計算組合數C(m,n)可知(即從m箇中選n個),這裏的 m表示的是m叉樹,而n 則表示該層結點數。


#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int k;

int C( int m,int n )
{
    int i,mul=1;
    for( i=0;i<n;i++ )
        mul*=(m-i);
    for( i=n;i>=1;i-- )
        mul/=i;
    return mul;
}

int solve( int m,char *pre,char *post )
{
    int i=1,j=0,re=1,son=0; //i爲pre下標,j爲post下標
                            //re統計結果,son表示子樹個數。
    while( i<m )
    {
        while( post[j]!=pre[i] )
            j++;
        son++;
        re*=solve( j+2-i,pre+i,post+i-1 );
        i=j+2;
    }
    return re*C( k,son );
}

int main()
{
    char pre[30],post[30];
    while( scanf( "%d",&k ) && k )
    {
        scanf( "%s%s",pre,post );
        printf( "%d\n",solve( strlen(pre),pre,post ) );
    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章