首页
社区
课程
招聘
[求助]请老师帮忙解决这两个问题的算法
发表于: 2006-6-1 22:54 6177

[求助]请老师帮忙解决这两个问题的算法

2006-6-1 22:54
6177

一。有人上楼梯,一步最多可迈三级,可能迈一级,两级,三级;若楼层共有n个台阶,问共计多少种不同走法?
    1.写出递推公式(即台阶数n和走法次数f(n)之间的关系)
    2.如何打印出每种走法

二。如下图,有一个无穷大的堆栈S,在堆栈的右边排列着1,2,3,4,5,----n共n个车厢。其中每个车厢可以向左行走,也可以进入栈让后面的车厢通过。请写出所有可能的到达出口的车厢排列情况。
        1.编程思路
        2.如何打印出各个车厢的排列情况

-----------------------
                    1,2,3,4------n  
-------   --------------
             |S |
             |  |


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
只要有算法就行了,请赐教
2006-6-1 23:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
一.

f(1) = 1
f(2) = 2 (一次走??,或走?次一?)
f(3) = 4 (1,1,1或1,2或2,1或3)

f(n) =  f(n-1) 最後一步走一?
        f(n-2) 最後一步走??
        f(n-3) 最後一步走三?

所以,程式用哝?(recursive)去????容易的
2006-6-2 15:37
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
第二个问题:
F(n) = C ( 2 * n, n) / ( n + 1 )
组合数学问题( 其中的C表示组合)

F(n)即 "Catalan数"
2006-6-2 15:54
0
雪    币: 1050
活跃值: (3747)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
5
DWORD CalcStep(UINT nStep)
{
        //不验证数据超出边界、不考虑运行效率
        //经测试,程序在我的机器上运行时超过30阶就容易没响应
        DWORD dwRet = nStep;
        if (nStep == 3)
        {
                dwRet = 4;
        }
        else if (nStep > 3)
        {
                DWORD ret1 = CalcStep(nStep - 1);
                DWORD ret2 = CalcStep(nStep - 2);
                DWORD ret3 = CalcStep(nStep - 3);
                dwRet = ret1 + ret2 + ret3;
        }
        return dwRet;
}

怀疑3楼的算法没有排除重复的走法
2006-6-2 16:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果只是要?算 f(n), 不需要用到 recursive
我是指要列出每一肺走法?, 可用 recursive

如果只要f(n)的值的?
step[1] = 1;
step[2] = 2;
step[3] = 4;

for(i=4;i<=30;i++)
{
  step[i] = step[i-1]+step[i-2]+step[i-3];
}
就可以了
如果用recursive去算f(n),那?重妖?算相同的f(n)很多次

?然,也可以不用recursive,而用?似上面的方法?列出每一肺走法,但是需要大量的空殓就是了

1: 1
2: 2
3: 4
4: 7
5: 13
6: 24
7: 44
8: 81
9: 149
10: 274
11: 504
12: 927
13: 1705
14: 3136
15: 5768
16: 10609
17: 19513
18: 35890
19: 66012
20: 121415
21: 223317
22: 410744
23: 755476
24: 1389537
25: 2555757
26: 4700770
27: 8646064
28: 15902591
29: 29249425
30: 53798080

呃???成樘的相?快,30肓已?是?相?大的?字了
2006-6-2 17:24
0
雪    币: 1050
活跃值: (3747)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
7
哦,不好意思,我不知道recursive是什么东东:)

这个有没有提高效率的办法?
2006-6-2 17:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
recursive 台?叫做哝?
大???是叫哝?吧? 我不催定

要提高效率的?
基本上是空殓??殓,或?殓?空殓的啉?

如果有很多空殓的?,
去硷? n-1, n-2, n-3 肓的每一肺走法
那?只要前面加上1,2,3
就可以褚上( O(1) )列出n肓的每一肺走法
2006-6-2 18:00
0
雪    币: 1050
活跃值: (3747)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
9
我想了很久也只是想出来这个办法。。。就是一个一个记下来,哈哈
那样递归就没有意义了:(
2006-6-2 18:21
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
多谢版主和各位兄弟,小弟又学到了一些东西
2006-6-3 12:46
0
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
第二题我是这样想的,不知道对不对(数学没学好,^_^)

选择进入栈的车,可以选1,2,3...一直到(N-1)辆车进入,进入后的车的顺序是不变的,并且需要等到前面的车出去了以后才能出栈,所以从栈出来的顺序也是不变的了应该是C(N-1 , 0)+C(N-1 , 1)+C(N-1 , 2)+...+C(N-1 , N-1)=POWER(2 , N-1)
(去掉1是因为最后一辆车不用入栈)

而没有入栈的车的顺序是不变的
2006-6-3 17:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
HOHO 找着一学习的好地方
2006-6-4 19:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好啊!学到知识了!
2006-6-5 22:41
0
游客
登录 | 注册 方可回帖
返回