poj 1240

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

好久之前自己写的,今天拿出来看看,越看越喜欢。题目意思,已知前序遍历跟后序遍历,求树共有多少种形态。前一篇随笔中提到了一点。

View Code
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

const int maxn=27;

char s1[maxn],s2[maxn];
int m,ans,pre;

int zuhe(int cnt)
{
    int count=1;
    for(int i=1;i<=cnt;i++)
    {
        count*=(m-i+1);
        count/=i;
    }
    return count;
}

void dfs(int beg,int end)
{
    int cnt=0;
    for(int i=beg;i<=end;i++)
    {
        if(s2[i]==s1[pre])
        {
            cnt++;
            pre++;
            dfs(beg,i-1);
            beg=i+1;
        }
    }
    ans*=zuhe(cnt);
}

int main()
{
    while(true)
    {
        scanf("%d %s %s",&m,s1,s2);
//        printf("%d %s %s\n",m,s1,s2);
        if(!m) break;
        int len=strlen(s1);
        ans=pre=1;
        dfs(0,len-2);
        printf("%d\n",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/RainingDays/p/2709722.html