zoukankan      html  css  js  c++  java
  • 剑指Offer-9.变态跳台阶(C++/Java)

    题目:

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

    分析:

    假设我们要求跳上第3级的跳法,可以从第0级跳3级台阶到达,也可以从第1级跳2级台阶到达,还可以从第2级跳1级到达。

    所以跳上第3级的跳法数等于到达第0级的跳数加上到达第1级的跳数再加上到达第2级的跳数,也就是f(3) = f(2) + f(1) + f(0)

    可以推导出f(n) = f(n-1) + f(n-2) + ... + f(2) + f(1) + f(0)

    我们还可以这样思考这个问题,从第0级跳到第n级需要经历n-1个台阶,因为青蛙可以跳1~n级青蛙跳上n级,青蛙跳法可以等价于台阶的选择,比如跳到3级时,青蛙先跳1级再跳两级,实际上就是青蛙从第0级先到达第1级台阶,再从第1级台阶跳到了第3级,而如果青蛙直接跳到了第3级,实际上就是没有使用台阶,所以青蛙的跳法等价于台阶的有无,跳到n级有n-1个台阶,每个台阶都存在使用或者不使用两个状态,所以最后的答案就是2^(n-1),或者是1<<(n-1)。

    程序:

    C++

    //dp
    class Solution {
    public:
        int jumpFloorII(int number) {
            if(number == 0) return 0;
            if(number == 1) return 1;
            vector<int> res(number+1, 0);
            res[0] = 1;
            res[1] = 1;
            for(int i = 2; i <= number; ++i){
                for(int j = 0; j < i; ++j)
                    res[i] += res[j];
            }
            return res[number];
        } 
    };

    Java

    public class Solution {
        public int JumpFloorII(int target) {
            return 1 << (target-1);
        }
    }
    /*import java.util.*;
    public class Solution {
        public int JumpFloorII(int target) {
            return (int)Math.pow(2, target-1);
        }
    }*/
  • 相关阅读:
    toj 2975 Encription
    poj 1797 Heavy Transportation
    toj 2971 Rotating Numbers
    zoj 2281 Way to Freedom
    toj 2483 Nasty Hacks
    toj 2972 MOVING DHAKA
    toj 2696 Collecting Beepers
    toj 2970 Hackle Number
    toj 2485 Card Tric
    js页面定位,相关几个属性
  • 原文地址:https://www.cnblogs.com/silentteller/p/11853204.html
Copyright © 2011-2022 走看看