九度 题目1044:Pre-Post

转载请注明本文链接http://blog.csdn.net/yangnanhai93/article/details/40658571

题目链接:http://ac.jobdu.com/problem.php?pid=1044

这个题目的分析估计都被写烂了,我这里就简单的说明一下,其实觉得他们写了好多好多很浅显的东西,希望我的分析能够给大家减轻点负担,虽然我也是看别人的分析之后才更加理解这个题目。

分析如下:

已知前序和后序,

1:我们先知道的,肯定是字符串第一个会等于最后一个

2:既然是m叉树,那么我们就要分析m叉树中有几个还有子树,然后我们就需要分析子树的由来。

3:子树中又有子树,这个就是组合数学中的一件事情分步完成,则最终的组合为步步相乘。

所以问题的关键就在于我怎么知道子树的存在呢?

找子树的过程,把前一个字符串记为A,后一个记为B

先执行步骤1,即跳过第一个字符,A=A+1;

然后把取出A的第一个字符A[0],在B中找,直到B[i]==A[0],就是一个子树

就分析下面最简单的两个吧

2 abc cba    4
2 abc bca    1

第一个,执行步骤1,剩下bc和cb,找完第一次就发现找完了,所以就只有1个子树,然后再去对bc进行查找

第二个,执行步骤1,剩下bc和bc,找到两个子树

#include <stdio.h>
#include <string.h>
int result;
int Cal(int n,int m)//计算组合数,从n个中选m个;
{
	if(m==n)
		return 1;
	else if (m==1)
		return n;
	else
		return Cal(n-1,m)+Cal(n-1,m-1);
}
void Count(char *A,char *B,int num)
{
	int n=strlen(A);
	if(n==1)
		return ;
	A=A++;//忽略第一个;
	B[n-1]='\0';//忽略最后一个;
	int count=0;
	while(*A)
	{
		int i=0;
		char newA[27],newB[27];
		while(A[0]!=B[i])
		{
			newA[i]=A[i];
			newB[i]=B[i];
			i++;
		}
		newA[i]=A[i];
		newB[i]=B[i];
		newA[i+1]='\0';
		newB[i+1]='\0';
		count++;//统计在当前这一层有多少个子树;
		A=A+i+1;
		B=B+i+1;
		Count(newA,newB,num);
	}
	result=result*Cal(num,count);
}

int main()
{
	int n;
	char A[27],B[27];
	//freopen("data.in","r",stdin);
	while(scanf("%d",&n)!=EOF)
	{
		scanf("%s%s",&A,&B);
		result=1;
		Count(A,B,n);
		printf("%d\n",result);
	}
}
时间: 2024-08-06 20:08:20

九度 题目1044:Pre-Post的相关文章

九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲

转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/40718149 简单说说宽度优先搜索BFS 说实话,这是第一个自己写的宽度优先搜索的题目,之前也是不太明白之间的区别,好吧,只能说自己学的太渣-- 言归正传,对于初学者来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧,我表示废话了,我其实就是这个样子的,然后一直不得甚解...所以第一次上来,我就直接搜索DFS,结果太明显,就是TLE或者MLE,然后就抓狂中,这可能是

九度 题目1123:采药

题目描述: 辰辰是个很有潜能.天资聪颖的孩子,他的梦想是称为世界上最伟大的医师. 为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题. 医师把他带到个到处都是草药的山洞里对他说: "孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值. 我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大." 如果你是辰辰,你能完成这个任务吗? 输入: 输入的第一行有两个整数T(1 <=

九度 题目1122:吃糖果

题目描述: 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0). 妈妈告诉名名每天可以吃一块或者两块巧克力. 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案. 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案: 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案: 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案: 如果N=4,则名名可以

九度 题目1205:N阶楼梯上楼问题

题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括一个整数N,(1<=N<90). 输出: 可能有多组测试数据,对于每组数据, 输出当楼梯阶数是N时的上楼方式个数. 样例输入: 4 样例输出: 5 分析:第n阶台阶的方法等于上到第n-1阶台阶的方法加上第n-2阶的台阶的方法之和,因为89阶的时候已经超过2的32次方,所以用long long int 代码如下: #include <stdio.h> long long int

九度 题目1448:Legal or Not

判断是否存在环的问题,本文采用的是拓扑排序,如果输出的节点少于N,则形成了环,和之前的1449几乎是一样的代码 题目链接http://ac.jobdu.com/problem.php?pid=1448 转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/41226369 #include <iostream> #include <memory.h> #include <queue> using names

九度 题目1449:确定比赛名次

很明显的拓扑排序问题,绘制成图之后会发现很好理解,刚开始我自己也不是很理解,画图之后思路特别清晰 转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/41226221 题目链接http://ac.jobdu.com/problem.php?pid=1449 #include <iostream> #include <memory.h> #include <queue> using namespace st

九度-题目1011:最大连续子序列

题目描述:     给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20.现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素. 输入: 测试输入包含若干测试用例,每个测试用例占2行,第1行给出

九度 题目1451:不容易系列之一

题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样. 话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的.比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情.如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难

九度 题目1045:百鸡问题

题目描述: 用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一种小鸡,分别记为x只,y只,z只.编程求解x,y,z所有可能解. 输入: 测试数据有多组,输入n. 输出: 对于每组输入,请输出x,y,z所有可行解,按照x,y,z依次增大的顺序输出. 样例输入: 40 样例输出: x=0,y=0,z=100 x=0,y=1,z=99 x=0,y=2,z=98 x=1,y=0,z=99 代码如下,一开始用了三重循环,后来稍微优化了一下,改成了两重循环: 三重循环的代码: #