九度OJ 题目1044:Pre-Post
来源:互联网 发布:移动支付软件 编辑:程序博客网 时间:2024/05/18 15:07
考察递归思想和前序遍历与后序遍历的元素序列之间的关系。
// 1044.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int cid[26][2]; //将字符映射到0~25,然后将他们在s1,s2中的下标分别记录在数组中
string s1,s2;
int min(int a,int b)
{
return a<b?a:b;
}
int m;
int func(int i)//m中任意选择i个的组合数
{
if(i==0)
return 1;
int ret=1;
int t=m;
int tmp=1;
while(i>=1)
{
ret*=t;
--t;
tmp*=i;
--i;
}
return ret/tmp;
}
int caculate(int j,int len)//s1中以第j个字符为根节点的子树的所有可能情况的数目,其中Len为该根节点的各子节点之和
{
if(len==0) //该根节点无子节点,可能情况数为1
return 1;
int id1=cid[s1[j]-'a'][0];
int id2=cid[s1[j]-'a'][1];
int childtreenum=0;//该根节点下的子树个数
int e1=id1+len;
int st2=id2-len;
int ret=1; //为该根节点下各子树的所有情况的乘积
int i=id1+1;
while(i<=id1+len)
{
int childid1=i;
int childid2=cid[s1[i]-'a'][1];
int childlen=min(childid2-st2,e1-childid1)+1;
++childtreenum;
st2=childid2+1;
ret*=caculate(i,childlen-1);//子树中以i为根节点的子树的所有可可能结构的数目
i+=childlen;
}
int t=func(childtreenum);//根节点j具有多个子树,子树之间的组合数
return ret*t;
}
int main()
{
while((cin>>m)&&m!=0)
{
cin>>s1>>s2;
for(int i=0;i<s1.size();++i)
{
cid[s1[i]-'a'][0]=i;
cid[s2[i]-'a'][1]=i;
}
cout<<caculate(0,s1.size()-1)<<endl;
}
return 0;
}
采用cid数组存储下标,减少查找时间,运行结果在10ms。
0 0
- 九度OJ 题目1044:Pre-Post
- 【九度】题目1044:Pre-Post
- 九度 题目1044:Pre-Post
- 九度 oj 题目1044:Pre-Post (确定树的状态)
- 九度 题目1044:Pre-Post m元树问题
- 题目1044:Pre-Post
- 题目1044:Pre-Post
- 题目1044:Pre-Post
- 九度OJ 1044:Pre-Post(先序后序) (n叉树、递归)
- 九度-1044-Pre-Post[分治和组合数]
- 九度OJ 题目1029
- 九度OJ 题目1018
- 九度OJ 题目1002
- 九度 1044:Pre-Post 递归求n叉树结构个数
- 题目1044:Pre-Post(递归的经典应用)
- 九度OJ 题目1058:反序输出
- 九度OJ 题目1062:分段函数
- 九度OJ 题目1063:整数和
- 创建本地源,使用yum install
- 解决linux下unzip中文有乱码的问题
- 设计模式之外观模式——一键电影模式
- 《TCP/IP详解》读书笔记(23章)-TCP的保活定时器
- 扩展欧几里得算法模板题 zoj 3609
- 九度OJ 题目1044:Pre-Post
- 设计模式之适配器模式——手机充电器
- csscan的一些tip
- C++:p2p通信,打洞技术,穿越NAT的实现
- 不允许创建临时变量,交换两个数的内容
- Android View measure (三) 常用方法
- 操作系统是如何工作的?——简单多道程序内核代码内核分析
- C#一个委托的例子
- 互联网 思维