zoukankan      html  css  js  c++  java
  • 青蛙跳

    题目描述:

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

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入包括一个整数n(1<=n<=70)。

    输出:

    对应每个测试案例,

    输出该青蛙跳上一个n级的台阶总共有多少种跳法。

    样例输入:
    5
    样例输出:
    8
    ---------------------------------------------------------------------------------------------------
    递推公式:f(n)=f(n-1)+f(n-2) ,n>2; f(1)=1,f(2)=2;海涛:第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)=f(n-1)+(f-2)。

    ------------------------------------------------------------------------------------------------------------

    递归方法:

    动态规划:

       

    #include <stdio.h>
    #include <stdlib.h>
    typedef unsigned int U32;
    static U32 frog_jump_ways(U32 n);

    int main() {
    U32 n;
    printf("Please input number:");
    scanf("%u", &n);
    printf("frog jum ways are %u ", frog_jump_ways(n));
    return 0;
    }

    static U32 frog_jump_ways(U32 n) {

    U32 i, ret = 0;
    U32* waysPtr = (U32*) calloc(n + 1, sizeof(U32));

    if (waysPtr == NULL)
            return ret;

    for (i = 1; i <= n; i++) {

            if (i == 1 || i == 2) {
                    waysPtr[i] = i;
            } else {
                    waysPtr[i] = waysPtr[i - 2] + waysPtr[i - 1];
            }

    }
    ret = waysPtr[n];
    free(waysPtr);
    return ret;
    }
     
     
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    const int N=71;
    long long val[N];
    long long f(const int n){
     if(n==1)
      return 1;
     else if(n==2)
      return 2;
     else{
      if(val[n-1]==0)
       val[n-1]=f(n-1);
      if(val[n-2]==0)
       val[n-2]=f(n-2);
      val[n]=val[n-1]+val[n-2];
      return val[n];
     }
    }
    int main()
    {
     int n;
     memset(val,0,sizeof(val));
     while(scanf("%d",&n)!=EOF){
      printf("%ld ",f(n));
     }
     return 0;
    }
     

    变态跳法:

    ---------------------------------------------------------------------------------------------------------------------------------

    题目描述:

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

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入包括一个整数n(1<=n<=70)。

    输出:

    对应每个测试案例,

    输出该青蛙跳上一个n级的台阶总共有多少种跳法。

    样例输入:
    5
    样例输出:
    8

    ---------------------------------------------------------------------------------------------------------------

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    const int N=51;
    long long val[N];
    long long f(const int n){
        if(n==1)
            return 1;
        else if(n==2)
            return 2;
        else{
            int i;
            long long sum=0;
            for(i=n-1;i>=1;i--){
               if(val[i]==0)
                  val[i]=f(i);
               sum+=val[i];
            }
            return sum+1;
        }
    }
    int main()
    {
        int n;
        memset(val,0,sizeof(val));
        while(scanf("%d",&n)!=EOF){
            printf("%lld ",f(n));
        }
        return 0;
    }

  • 相关阅读:
    Java new关键字的对象内存分配原理
    Android idleHandler
    Android Perffto工具
    Android Systrace工具
    Android TraceView工具
    Android App启动时间测量
    Android App启动分类
    Android线程的消息队列
    2018.2.28(延迟加载和缓存)
    2018.2.27(关联查询)
  • 原文地址:https://www.cnblogs.com/xiao-wei-wei/p/3354776.html
Copyright © 2011-2022 走看看