Code[VS] 1029 遍历问题
2015-02-23 13:36
274 查看
【题意】给定前序遍历和后序遍历(a-z且不重复),求中序遍历的方法数
【分析】
设前序遍历为s,后序遍历为t
设DFS(ls,rs,lt,rt)表示前序遍历为s[ls..rs],后序遍历区间为t[lt..rt]的方法数
若ls>=rs则肯定只有1种情况,返回1
由遍历的性质知道根节点=前序遍历的第一个=后序遍历的最后一个即s[ls]=t[rt],若不等于则返回0
找到wt使得t[wt]=s[ls+1],若wt=lt-1则返回DFS(ls+1,rs,lt,rt-1)<<1,
否则返回DFS(ls+1,ws,lt,wt)*DFS(ws+1,rs,wt+1,rt-1)
【实现】
【分析】
设前序遍历为s,后序遍历为t
设DFS(ls,rs,lt,rt)表示前序遍历为s[ls..rs],后序遍历区间为t[lt..rt]的方法数
若ls>=rs则肯定只有1种情况,返回1
由遍历的性质知道根节点=前序遍历的第一个=后序遍历的最后一个即s[ls]=t[rt],若不等于则返回0
找到wt使得t[wt]=s[ls+1],若wt=lt-1则返回DFS(ls+1,rs,lt,rt-1)<<1,
否则返回DFS(ls+1,ws,lt,wt)*DFS(ws+1,rs,wt+1,rt-1)
【实现】
#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int len; char s[30],t[30]; int DFS(int ls,int rs,int lt,int rt) { if (s[ls]^t[rt]) return 0; if (ls>=rs) return 1; for (int ws=ls+1,wt=lt;;ws++,wt++) if (t[wt]==s[ls+1]) return wt==rt-1?DFS(ls+1,rs,lt,rt-1)<<1:DFS(ls+1,ws,lt,wt)*DFS(ws+1,rs,wt+1,rt-1); } int main(void) { scanf("%s%s",s,t); len=strlen(s); printf("%d\n",DFS(0,len-1,0,len-1)); return 0; }
相关文章推荐
- 遍历问题[CODEVS1029]解题报告
- CODE[VS] 1029 遍历问题
- CODE[VS]1029 遍历问题
- code vs 1029 遍历问题 区间dp
- codevs1029遍历问题
- 二叉树结构 codevs 1029 遍历问题
- codevs 1029 遍历问题
- [codevs] 1029 遍历问题
- codevs1029 遍历问题(一直前序和后序求中序个数)
- codevs 1029 遍历问题
- codevs1282 约瑟夫问题
- codevs1282 约瑟夫问题 线段树
- codevs N皇后问题 回溯法
- codevs1219 骑士遍历(棋盘DP)
- CODEVS 3143 二叉树的序遍历
- CODE[VS] 1016 税收与补贴问题
- Code[vs]1014 装箱问题
- Code[VS] 3377 接水问题2
- codevs1033 蚯蚓的游戏问题
- codevs1906 最长递增子序列问题