• php实现变态跳台阶(记忆化递归)


    php实现变态跳台阶(记忆化递归)

    一、总结

    1、本题思路(分类讨论思路,注意初始值和边界值):第一步如果1,那剩下的就是jumpFloorII($number-1)(下面jumpFloorII以j表示),第一步如果2,那剩下的就是j($number-2),...,以此类推

    所以j(n)=j(n-1)+j(n-2)+...+j(0),其实j(n)就是2的n次方

    二、php实现变态跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    三、代码

    牛客网ac代码一:

     1 <?php
     2 
     3 $arr = array(1,1,2,4);//记忆化递归数组  1、$arr[0]=1而不是0
     4 for($i=4;$i<500;$i++) $arr[$i]=-1;
     5 function jumpFloorII($number)
     6 {
     7     global $arr;
     8     if($arr[$number]!=-1) return $arr[$number]; //2、这里的$arr忘记接[$number]
     9     $ans=0;
    10     for($i=1;$i<=$number;$i++){
    11         $arr[$number-$i]=$arr[$number-$i]!=-1?$arr[$number-$i]:jumpFloorII($number-$i); //3、这里的变量i漏掉了$符号
    12         $ans+=$arr[$number-$i];
    13     }
    14     return $arr[$number]=$ans;
    15 }

    代码二:

     1 //变态跳台阶
     2 private $arr = array();//记忆化递归数组
     3 public function jumpFloorII($number)
     4 {
     5     global $arr;
     6     if($arr[$number]!=-1) return $arr[$number];
     7     $ans=0;
     8     for($i=1;$i<=$number;$i++){
     9         $arr[$number-$i]=$arr[$number-$i]!=-1?$arr[$number-$i]:$this->jumpFloorII($number-$i);
    10         $ans+=$arr[$number-$i];
    11     }
    12     return $arr[$number]=$ans;
    13 }
    14 public function jumpFloorIIDemo(){
    15     global $arr;
    16     for($i=0;$i<500;$i++) $arr[$i]=-1;
    17     $arr[0]=1;
    18     $arr[1]=1;
    19     $arr[2]=2;
    20     $arr[3]=4;
    21     echo($this->jumpFloorII(30));
    22     dump($arr);die;
    23 }

  • 相关阅读:
    [NOI2005]维修数列
    [USACO07OPEN]吃饭Dining
    [TJOI2010]打扫房间
    [SCOI2005]最大子矩阵
    [HNOI2007]最小矩形覆盖
    [HAOI2006]受欢迎的牛
    BZOJ2087[Poi2010] Sheep
    [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    [POI2013]BAJ-Bytecomputer
    HGOI20190126 模拟赛
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9036312.html
Copyright © 2020-2023  润新知