青蛙跳

题目描述:

一只青蛙一次可以跳上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\n", 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\n",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\n",f(n));
    }
    return 0;
}

posted @ 2013-10-06 22:50  小薇林  阅读(268)  评论(1编辑  收藏  举报