hdu2044

#include <iostream>

using namespace std;

int how(int a,int b)

{     int sim,dou,sum=1;    

sim=a+1;    

dou=a+2;    

if(sim==b || dou==b)    

{         return sum;     }    

else     {        

sum+=how(sim,b)+how(dou,b);

    }    

return sum; }

int main()

{     int n;    

while(scanf("%d",&n)!=EOF)    

{         while(n)        

{             int a,b;            

cin>>a;             cin>>b;            

cout<<how(a,b)<<endl;            

n--;         }     }

    return 0; }

这个代码超时了。

最近才在弄做题还比较菜呀。

 

什么是acm,就是用最简单的方式解决问题,虽然这个题可以用递归但是还有更简单的方式:

看到蜂巢上的数字其实可以明白了。相差为1或2的两个蜂巢都只有一条路能通到。而相差3的呢?其实就是走到b点相邻点的方式有几种,与b直接相邻的这有两个点。那到b定其实就是到b-1点和到b-2点的路数之和,这就回到了大家很熟悉的斐波那契数列了,体也就解决了。

 

#include<stdio.h>

int main()

{

  int n;

   __int64 f[55];

  f[1]=1;

  f[2]=1;

  for(int i=3;i<55;i++)

  {

    f[i]=f[i-1]+f[i-2];

  }

    while(n--)

    {

      int a,b;

      scanf("%d%d",&a,&b);

      printf("%I64d\n",f[b-a+1]);

    }

return 0;

}

 

posted @ 2012-11-19 20:12  sallce  阅读(724)  评论(0编辑  收藏  举报