• 跳台阶问题(递归分治)


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

    分析:递归做或者直接嵌套循环

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int ans=0;
     5 /*int f(int n){//递归算法,效率低!!!
     6     if(n==0) return 0;
     7     if(n<=2) return n;
     8     return f(n-1)+f(n-2); 
     9 }*/
    10 
    11 int f(int n){/*嵌套循环*/
    12     if(n==0) return 0;
    13     if(n==1) return 1;
    14     int a=1,b=1;
    15     int sum=0;
    16     for( int i=2; i<=n; i++ ){
    17         sum=a+b;
    18         a=b;
    19         b=sum;
    20     }
    21     return sum;
    22 }
    23 
    24 int main(int argc, char const *argv[])
    25 {
    26     int n;
    27     cin>>n;
    28     ans=f(n);
    29     cout<<ans<<endl;
    30     return 0;
    31 }

      拓展:变态跳台阶问题

     
    题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级......它也可以跳上n级。此时该青蛙跳上一个n级的台阶总共有多少种跳法?
     
    分析:用f(n)表示青蛙跳上n阶台阶的跳法数,设定f(0) = 1;
    当n = 1 时,只有一种跳的方式,一阶跳,f(1) = 1
    当n = 2 时,有两种跳的方式,一阶跳和两阶跳,f(2) = f(1) + f(0) = 2
    当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有f(3-1)中跳法; 第一次跳出二阶后,后面还有f(3-2)中跳法;第一次跳出三阶后,后面还有f(3-3)中跳法,f(3) = f(2) + f(1) + f(0) = 4
    当n = n 时,第一次跳出一阶后,后面还有f(n-1)中跳法; 第一次跳出二阶后,后面还有f(n-2)中跳法......第一次跳出n阶后,后面还有 f(n-n)中跳法,即:
    f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-n)+1 =1+ f(0) + f(1) + f(2) + ... + f(n-1)
    又因为 f(n-1) =1+ f(0) + f(2) + f(3) + ... + f(n-2)
    两式相减得:f(n) = 2 * f(n-1)    ( n >= 2)
                     |  0,n = 0
    f(n)   =       |  1, n = 1
                     |  2 * f(n-1) , n >= 2
     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int ans=0;
     5 // int f(int n){//递归算法,效率低!!!
     6 //     if(n==0) return 0;
     7 //     if(n==1) return 1;
     8 //     return f(n-1)*2; 
     9 // }
    10 
    11 int f(int n){/*嵌套循环*/
    12     if(n==0) return 0;
    13     if(n==1) return 1;
    14     int sum=1;
    15     for( int i=2; i<=n; i++ ){
    16         sum=2*sum;
    17     }
    18     return sum;
    19 }
    20 
    21 int main(int argc, char const *argv[])
    22 {
    23     int n;
    24     cin>>n;
    25     ans=f(n);
    26     cout<<ans<<endl;
    27     return 0;
    28 }
    有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
  • 相关阅读:
    BOI 2002 双调路径
    BOI'98 DAY 2 TASK 1 CONFERENCE CALL Dijkstra/Dijkstra+priority_queue/SPFA
    USACO 2013 November Contest, Silver Problem 2. Crowded Cows 单调队列
    BOI 2003 Problem. Spaceship
    USACO 2006 November Contest Problem. Road Blocks SPFA
    CEOI 2004 Trial session Problem. Journey DFS
    USACO 2015 January Contest, Silver Problem 2. Cow Routing Dijkstra
    LG P1233 木棍加工 动态规划,Dilworth
    LG P1020 导弹拦截 Dilworth
    USACO 2007 February Contest, Silver Problem 3. Silver Cow Party SPFA
  • 原文地址:https://www.cnblogs.com/Bravewtz/p/10471064.html
Copyright © 2020-2023  润新知