题目1
【问题描述】梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编写一个程序,计算共有多少中不同走法?
【思路】看到此题目容易想到用递归的方法来做,因为递归是一种描述和解决结构自相似问题的基本算法,而N阶楼梯问题和N-1阶、N-2阶的结构完全相同。解决递归问题可以分为两个部分,第一部分是一些特殊(基础)情况,用直接法解,即始基;第二部分与原问题相似,可用类似的方法解决(即递归),但比原问题的规模要小。
【解法】
定义int count(int n)函数求解N阶楼梯的走法,基于上述思想,可知:
1)N阶楼梯问题的始基是N==1、N==2两种情况;
2)N>=3时,上楼可以一步上一阶,也可以一步上二阶,当上一阶时问题规模变为N-1,当上二阶时问题规模变为N-2,所以总的情况为count(n-1)+count(n-2)。
【代码】
int count(int n)
{
if(1 == n)
return 1;
else if(2 == n)
return 2;
else return count(n-1) + count(n-2);
}
题目2
【问题描述】某比赛共有36名运动员参加,运动员共分为6组每组6人,每轮次只能1组进行比赛。假设每轮次比赛运动员发挥稳定,其成绩在每轮比赛保持中不变。请问至少需要多少轮比赛成赛出前3名?
【思路】这是典型的“空间换时间”问题,需要6轮比赛就可以得出前三名。记录下每轮比赛运动员的成绩,直接就能得到结果。
【问题描述】有n张扑克牌,每张牌的取值范围是:2,3,4,5,6,7,8,9,10,J,Q,K,A。在这n张牌中找出顺子(5张及5张以上的连续的牌),并将这些顺子打印出来。要求:1)顺子尽可能长;2)顺子尽可能多;3)每张牌只能使用一次;
例如:输入:234567789 10 J 结果为:234567 和789 10 J
【思路】
1.创建一个长度为13的数组Card[13],用来记录每张牌(2-A)出现的次数;
2.扫描数组Card,获取最长的顺子,并将Card数组相对应的值减一;继续扫描该数组,直到没有顺子为止;把扫描得到的顺子存入容器S;
3.将扫描剩余的牌组成“小顺子”(个数小于5的顺子)存入容器T;
4.读取容器T中的“小顺子”,与容器S中的大顺子比较;若能满足分割大顺子的条件,则将大顺子进行分割,并将结果存入容器T。若该小顺子不能满足任意一个大顺子的分割条件,则丢弃该小顺子,读取下一个小顺子继续本操作,直到容器T为空;
5.容器S中的顺子即为运算结果,可以打印输入了。
顺子分割条件:
设大顺子为[X1 ... Xn] 小顺子为[x1 ... xm],
(1)若小顺子为大顺子的子集,则进行(2)操作;否则,直接退出(不能进行分割);
(2)若xm - X1 >= 5 && Xn - x1 >= 5,则可以分割为[X1 ... xm] [x1 ... Xn];否则不能进行分割;
阅读(1610) | 评论(0) | 转发(1) |