一种排列问题的解答
一种排列问题的解答
1.
路程为100步,一个人每次可以走1步,走2步,走3步。问:走完这100步有多少种走法?
2.
1)一个机器人上台阶,机器人的指令有A:上一台阶;B:上两台阶;现要上N台阶,有多少种指令排列?
2)现在发生一个错误指令C:下一台阶;此指令在机器人上台阶过程中只执行一次(有且仅有一次),问:上N台阶有多少种指令排列?
(这是我百度一面的题目)
解这一类问题的方法之一就是用动态规划的方法把大的问题分解为不同的子问题来解决,降低问题的范围,这样能帮助我们更好的去思考这个问题。第一题的分析过程是解后面两个题的关键。
(动态规划是编程的一种基本思想,想要掌握好有一定难度。)
第一题
面对路程为100步,可能我们很难进行任何思考,不妨把路程设为n步,设f(n)为路程为n时的走法数,设A为走1步,B为走2步,C为走3步;先从n=0开始。
当n=0时,我们无从选择,所以f(0)=0;
当n=1时,第一步只能选择A,剩下0步,所以f(1)=1 + f(0)=1;
当n=2时,第一步可以选择A和B,对于选择A,我们还需要走1步,那剩下这1步的
走法很显然是f(1);对于选择B,第一步就完成了,;所以f(2)=f(1)+1=2;
当n=3时,第一步可以选择A、B、C,对于选A,剩下f(2)种组合;对于选B,剩下f(1)种走法;对于选C剩下f(0)种走法;所以f(3)=f(2)+f(1)+1=4;
当n=4,第一步可选A、B、C,选A,剩f(3);选B剩f(2);选C剩f(1);所以f(4)=f(3)+f(2)+f(1);
当n=5,f(5)=f(4)+f(3)+f(2);
。。。
当n=n,f(n)=f(n-1)+f(n-2)+f(n-3);
f(n)=f(n-1)+f(n-2)+f(n-3)的意思可以理解为先走1步,剩下n-1步的走法加先走2步,剩下n-2步的走法加先走3步剩下n-3步的走法;f(1)=1;f(2)=(2),f(3)=4;这样就形成了一个完整的递归式。
第二题
1) f(n)=f(n-1)+f(n-2);f(1)=1;f(2)=2;
2) 设C(下一台阶)发生在k台阶(k>=1),那么就是说明了机器人已经上了k个台阶,上k个台阶有f(k)个指令排列;下一个台阶,那么就还有n-k+1的台阶需要上,上n-k+1个台阶的指令排列数是f(n-k+1);所以有一个二元函数F(n,k)=f(k)*f(n-k+1)表示机器人在第k个台阶执行C指令的情况下,上n个台阶的指令排列数。又因为C指令有可能发生在1~N中的任意一个位置,所以在对二元函数F(n,k)=f(k)*f(n-k+1)从k=1到k=n求和即得到答案。
个人博客:http://alexyang.sinaapp.com