zoukankan      html  css  js  c++  java
  • 一种排列问题的解答

    一种排列问题的解答

     

    1.       路程为100步,一个人每次可以走1步,走2步,走3步。问:走完这100步有多少种走法?

    2.       1)一个机器人上台阶,机器人的指令有A:上一台阶;B:上两台阶;现要上N台阶,有多少种指令排列?

      2)现在发生一个错误指令C:下一台阶;此指令在机器人上台阶过程中只执行一次(有且仅有一次),问:上N台阶有多少种指令排列?

    (这是我百度一面的题目)

     

    解这一类问题的方法之一就是用动态规划的方法把大的问题分解为不同的子问题来解决,降低问题的范围,这样能帮助我们更好的去思考这个问题。第一题的分析过程是解后面两个题的关键。

    (动态规划是编程的一种基本思想,想要掌握好有一定难度。)

     

    第一题

    面对路程为100步,可能我们很难进行任何思考,不妨把路程设为n步,设fn)为路程为n时的走法数,设A为走1步,B为走2步,C为走3步;先从n=0开始。

    n=0时,我们无从选择,所以f0=0

    n=1时,第一步只能选择A,剩下0步,所以f1=1 + f0=1

    n=2时,第一步可以选择AB,对于选择A,我们还需要走1步,那剩下这1步的

    走法很显然是f1);对于选择B,第一步就完成了,;所以f2=f1+1=2;

    n=3时,第一步可以选择ABC,对于选A,剩下f2)种组合;对于选B,剩下f1)种走法;对于选C剩下f0)种走法;所以f3=f2+f1+1=4

    n=4,第一步可选ABC,选A,剩f3);选Bf2);选Cf1);所以f4=f3+f2+f1);

    n=5f5=f4+f3+f2);

    。。。

    n=nfn=fn-1+fn-2+fn-3);

     

    fn=fn-1+fn-2+fn-3)的意思可以理解为先走1步,剩下n-1步的走法加先走2步,剩下n-2步的走法加先走3步剩下n-3步的走法;f1=1f2=2),f3=4;这样就形成了一个完整的递归式。

     

    第二题

    1)  fn=fn-1+fn-2);f1=1f2=2

    2)  C(下一台阶)发生在k台阶(k>=1),那么就是说明了机器人已经上了k个台阶,上k个台阶有fk)个指令排列;下一个台阶,那么就还有n-k+1的台阶需要上,上n-k+1个台阶的指令排列数是fn-k+1);所以有一个二元函数Fnk=fk*fn-k+1)表示机器人在第k个台阶执行C指令的情况下,上n个台阶的指令排列数。又因为C指令有可能发生在1N中的任意一个位置,所以在对二元函数Fnk=fk*fn-k+1)从k=1k=n求和即得到答案。


    个人博客:http://alexyang.sinaapp.com

    微博:http://weibo.com/2027595905

  • 相关阅读:
    C++内存管理
    多线程和多进程的区别(C++)
    如何用C语言封装 C++的类,在 C里面使用
    C/C++将一个整型数组拼接成一个字符串
    C代码中如何调用C++ C++中如何调用C
    Application对象的使用-数据传递以及内存泄漏
    《鸟哥的Linux私房菜》读书笔记二
    《鸟哥的Linux私房菜》读书笔记一
    greenDaoMaster的学习研究
    Handler 引起的内存泄露
  • 原文地址:https://www.cnblogs.com/alexyang8/p/2212634.html
Copyright © 2011-2022 走看看