您的位置:首页 > 其它

遍历问题[CODEVS1029]解题报告

2014-11-05 21:44 267 查看
思路:当这棵树有两个子树时,ans=dfs(l[root])*(r[root]);

当这棵树有一个子树时,ans=dfs(child[root])<<1;

当这棵树没有子树时,ans=1;

递归即可。

但是这里我写的时候一不小心写错了一个问题,就是第一种情况应该是乘而非加。。

#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
typedef short hd;
hd qpos[27],hpos[27];
char qm[28],hb[28];
int dfs(hd ql,hd qr,hd hl,hd hr){
    if(ql==qr)
        return 1;
    if(qm[ql+1]==hb[hr-1])return dfs(ql+1,qr,hl,hr-1)<<1;
    return dfs(ql+1,hpos[hr-1]-1,hl,qpos[ql+1])*dfs(hpos[hr-1],qr,qpos[ql]+1,hr-1);
}
int main(){
    scanf("%s%s",qm,hb);
    hd ql=strlen(qm);
    for(hd i=0;i<ql;++i)
        for(hd j=0;j<ql;++j)
            if(hb[j]==qm[i]){
                qpos[i]=j,hpos[j]=i;
                break;
            }
    printf("%d\n",dfs(0,ql-1,0,ql-1));
}


小浩浩还提供了一种更简洁更优秀的思路:

其ans若是增加,必是因为其出现了仅有一棵子树的情况(<<1),所以我们只要统计只有一棵子树的节点个数n,输出2<<n即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: