变态跳台阶

思路:

这题明显比前面一提要难得多,关键是跳的级数不确定了。
这题一开始一看我就知道可以从最底下,深搜到顶。(因为牛客对算法复杂度要求不是太高,要是这题在洛谷绝对GG)

深搜模板了解下;

public  void dfs(int i, int k) {
        if(i>k)return;
        if(i==k) {
            sum++;
            return;
        }
        for (int j = 1; j <=k; j++) {
            i +=j;
            if(i<=k)dp(i,k);
            i-=j;
        }
//  万变不离其宗的模板;

我们来尝试找一下规律

n1234567
F(n)1248163264

找规律得F(n)=2F(n-1)

这样只能说是硬找的规律,要是硬推要怎么推呢?

F(2)=F(1)+F(0)F(3)=F(0)+F(1)+F(2)F(4)=F(0)+F(1)+F(2)+F(3)F(n1)=F(0)+F(1)+F(2)++F(n2)F(n)=F(0)++F(n2)+F(n1)F(n1)=F(0)+F(1)+F(2)++F(n2)F(n)=2F(n1); F ( 2 ) = F ( 1 ) + F ( 0 ) F ( 3 ) = F ( 0 ) + F ( 1 ) + F ( 2 ) F ( 4 ) = F ( 0 ) + F ( 1 ) + F ( 2 ) + F ( 3 ) F ( n − 1 ) = F ( 0 ) + F ( 1 ) + F ( 2 ) + … … + F ( n − 2 ) F ( n ) = F ( 0 ) + … … + F ( n − 2 ) + F ( n − 1 ) 因 为 F ( n − 1 ) = F ( 0 ) + F ( 1 ) + F ( 2 ) + … … + F ( n − 2 ) 所 以 F ( n ) = 2 ∗ F ( n − 1 ) ;

得出我们的递推式。

其实我们还可以找到一种更简单的规律
F(n)=2(n1) F ( n ) = 2 ( n − 1 )

//方法一: 深度优先算法
public int sum =0;
    public int JumpFloorII(int target) {

        dfs(0,target);
        return sum;
    }
        public  void dfs(int i, int k) {
        if(i>k)return;
        if(i==k) {
            sum++;
            return;
        }
        for (int j = 1; j <=k; j++) {
            i +=j;
            if(i<=k)dp(i,k);
            i-=j;
        }

    }
// 方法二:递推式
public int JumpFloorII(int target) {

    if(target<=2)return target;

        return 2*JumpFloorII(target-1);
    }

    //其实这个方法就挺好的了,没有大量重复计算。

// 方法三:找规律,
 public int JumpFloorII(int target) {
          if(target<=2) return target;
        return  (int)Math.pow(2, target-1);
        // return  1<<(target-1);  两种方法都可以
    }
//其实这题还有居多的做法, 比如(记忆化搜索,动态规划,留给大家来思考)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值