遍历问题[CODEVS1029]解题报告
2014-11-05 21:44
267 查看
思路:当这棵树有两个子树时,ans=dfs(l[root])*(r[root]);
当这棵树有一个子树时,ans=dfs(child[root])<<1;
当这棵树没有子树时,ans=1;
递归即可。
但是这里我写的时候一不小心写错了一个问题,就是第一种情况应该是乘而非加。。
小浩浩还提供了一种更简洁更优秀的思路:
其ans若是增加,必是因为其出现了仅有一棵子树的情况(<<1),所以我们只要统计只有一棵子树的节点个数n,输出2<<n即可。
当这棵树有一个子树时,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即可。
相关文章推荐
- codevs 1282 约瑟夫问题 大暴力? 解题报告
- codevs 1620 轮船问题 DP 解题报告
- 二叉树结构 codevs 1029 遍历问题
- codevs 1282 约瑟夫问题 树状数组正解 解题报告
- codevs1295 N皇后问题 解题报告
- codevs 1029 遍历问题
- codevs1029遍历问题
- codevs 1025 选菜 背包问题 解题报告
- codevs1029 遍历问题(一直前序和后序求中序个数)
- CODE[VS]1029 遍历问题
- code vs 1029 遍历问题 区间dp
- CODE[VS] 1029 遍历问题
- Code[VS] 1029 遍历问题
- codevs 1231 最优布线问题 并查集 解题报告
- codevs 1029 遍历问题
- [codevs] 1029 遍历问题
- codevs 2602 最短路径问题 Floyd 解题报告
- 习题:codevs 1519 过路费 解题报告
- 【解题报告】食物链[codevs 1074][rqnoj 455]
- 【codevs1684】垃圾陷阱 解题报告