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;

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

原文地址:https://www.cnblogs.com/SindarDawn/p/5805325.html