• 2016.8.25 递推


    由于博客是写给自己看的,所以用到了大量简写题也没有写出来,有需要的可以联系我要题目的pdf,本章ppt,讲义以及题目测试数据,由于上传不方便我就不上传了,联系邮箱SindarDawn@163.com

    注:数列样式从0开始

    小知识:其实所有的加法都暗含了*1,这就可以解释为什么有时是加法原理而有时是乘法原理;

    注意:加法和乘法的选择一定要注意,

    一.定义理解:用若干步简单运算来描述复杂问题,中间不存在取舍(区分开DP:求结果VS求最优)(但判断啊循环啊之类的语句还是可以有的),可顺(已知到问题)可逆(问题到已知)(区分开递归:递归函数调用自身),如果是逆向的话记忆化可以节约很多时间,有的情况下可以直接用通项公式解决(要小心中间运算溢出);

        特殊的迭代;(相比之下搜索就是把每一种情况的图都画出来)

    优化:前缀和,找公式,找公式相同部分;

    二.典型标志:有意义的数列(找规律)

    三.方法/模板:找最小互不相同模块!  

    1.固定数列先找再证明:

         1).Fibonacci数列

          递推公式:F(n)=F(n-1)+F(n-2);

      数列性质:兔子繁殖(刚出生的等于上上次的兔子数也就是生的兔子(因为,下一个月新增的兔子不能生)加上上个月的兔子(也就是兔子总数));

      数列样式:1,1,2,3,5,8,13,21,34;

      思维亮点:

      ①这个式子同样适用于与其性质不同的一步两步上楼梯问题,事实上,他们等于前者

        加上前前者的原因各不相同,而上楼梯问题显然归属于另一个更广阔的递推类型:

        确定当前状态递推;

      ②这个式子同时还可以用另一种方式解决,非常巧妙,虽然时间复杂度还要略微高一

        点,这大概就是传说中的不是正解胜似正解吧;(但这个方法的合理性只在一道题

        上有用,也就是1*2的棋子横竖放,棋盘为n*2 小紫10.3.1.4,当然在其他题里面,

        如果直接把一般砍掉还是可以理解的(重复不考虑原则))

        方法是这样的:选定从左至右的第一个为竖着的,则左边为偶数则为1,为奇数则 

        为0,右边就是原来的;

        思维亮点:从中间考虑;漏洞百出的算法一直打补丁也有可能变对;

      ③自己想了一种方法,不过只能用于2的次方所以没有什么用,就是分治,比如

        f8=f4*f4+f3*f3(因为把两个的放中间了),不过到后来,连f(n-1)都没有了,所以这

        个方法完全没有什么用啊(欲哭无泪);

      2).平面分割问题

        递推公式:an=a(n-1) +2(n-1);

        思维亮点:这种题很灵活,要看出其中的模型,也要分清这个模型和容斥的联系;

      3).Catalan数:

        递推公式:累加CiCn-i+1,i从2到n-1,C3定为1,:定一点,剩下两点相乘;

        本质很容易理解却比较复杂,其实和排列组合(点中选点)也有一定关系,不过这

        些都是后话了;

      4).第二类Stirling数:

        递推公式:S(n,m)=m*S(n-1,m)+S(n-1,m-1);

        集合类问题也很容易理解其本质,这种确定当前状态的方式也很别致,很经典的一

        道题,很经常遇到以这题为模板的题;

    四.融会贯通:

    (一).典型上手例题:

     1.Fibonacci数列

     2.平面分割问题:

       1).平面分割: 小黄2.3.8;

        从小分析到大;

     2.确定当前状态递推:

       1).Tower of Hanoi:小紫10.3.1.1;

         一个非常典型的题,只求方案数不要求输出路径的解法是标准递推,要注意边界;

         思维亮点:

         ①上面的式子还可以进一步简化成2^n -1,但如果不用快速幂算法的话

           时间复杂度是一样的;

         ②引入一种新的证明方法叫做:数学归纳法,是从递归的角度从小开

           始证明的;

      2).数塔问题 :小黄2.3.1:

        新手上手问题,我个人倾向于认为这是DP,因为有阶段有状态有决策转移;

        思维亮点:从后向前推可以免去一次最后层循环(用于能拿多少拿多少的程序简化);

      3).棋盘格数: 小黄2.3.3

        需要常规的分析而且需要提炼公式(如果n,m很大的话),所以一定要在相出算法

        以后看看能不能再简化!这道题还不错,作为入手可以思考一下;

      4).昆虫繁殖: 小黄2.3.4

        其实确定当前状态范围很大,比如类似斐波那契数列的昆虫繁殖;这道题可以根据       

        前后关系用一个数组搞定,不过容易错一般没必要;(必然性数列);

      5).位数问题: 小黄2.3.5

        定当前奇偶(也就是唯一的影响因素)来继续推,杨钊的那道线性动规也体现了这

        一点,很经典,很重要;

      6).过河卒:   小黄2.3.6

        很经典的矩阵递推,边界处理很重要,还是常见问题:变量,初始化;

     3.最小单元递推(特殊的确定当前状态递推):

       1)1*2的棋子可横或竖放,棋盘为n*2 小紫10.3.1.4

    (二).经典错误例题:

         1.火车站:推式子时不能忽略,一定要兼顾所有项,养成自己的编程习惯,不要受制

          于题给变量的名称,要考虑极端情况的适用性;

    (三).较高难度例题:

         1.极值问题:小黄练习6;

         很重要的数学思想:迭代轮换!其实是披着递推模板但实质是数论的题;

  • 相关阅读:
    GridControl主从表设置
    Asp.net Ajax框架教程
    实现类似百度下拉框自动匹配功能
    将一个DataTable分解成多个DataTable
    找不到可安装的ISAM ,asp.net读取数据丢失,解决的一列里有字符与数字的
    StringCollection FAQ [C#, BCL]
    从枚举的初始化说起 [C#]
    当多态遇上数组 ... [C++] (Rewritten)
    我并不是不闻不问![C#]
    当多态遇上数组 ... [C++, C++/CLI, C#]
  • 原文地址:https://www.cnblogs.com/SindarDawn/p/5805325.html
Copyright © 2020-2023  润新知