一只小蜜蜂...
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 57562 Accepted Submission(s): 20790
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。
Output
对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
Sample Input
2
1 2
3 6
Sample Output
1
3
Author
lcy
Source
递推求解专题练习(For Beginner)
Recommend
lcy | We have carefully selected several similar problems for you: 2045 2046 2050 2041 2047
来源: http://acm.hdu.edu.cn/showproblem.php?pid=2044
//基本算法
#include<stdio.h>
long long I[51];
int main(void)
{
int T;
while(~scanf("%d",&T))
{
for(;T>0;T--)
{
int a,b;
scanf("%d %d",&a,&b);
I[1]=1;I[2]=1;
for(int i=3;i<=b-a+1;i++) I[i]=I[i-1]+I[i-2];
printf("%lld\n",I[b-a+1]);
}
}
}
//吐槽点1: long long 才放的下
//吐槽点2:看似递归能够轻松解决但是妥妥时间超限,只能用递推
//此题有妙解:因为不需要存放前面的值,因此可以不用数组存放递推
#include<stdio.h>
long long I[51];
int main(void)
{
int T;
while(~scanf("%d",&T))
{
for(;T>0;T--)
{
int a,b;
scanf("%d %d",&a,&b);
if(b-a+1==1||b-a+1==2) printf("1\n");
else
{
long long int A=1,B=1,C;
for(int i=3;i<=b-a+1;i++)
{
C=A+B;
A=B;
B=C;
}
printf("%lld\n",C);
}
}
}
}
// DP记忆化搜索
#include <cstdio>
#include <cstring>
#define MAX 50
long long A[MAX+1];
long long ways(int b)
{
if(A[b]>0) return A[b];//若已经结算过直接返回即可
if(b==2||b==1) return A[b]=1;
return A[b]=ways(b-1)+ways(b-2);//返回值的同时记录大小
}
int main(void)
{
memset(A,-1,sizeof(A[0]));
int N;scanf("%d",&N);
for(int i=1,a,b;i<=N&&scanf("%d %d",&a,&b);i++)
printf("%I64d\n",ways(b-(a-1)));//化为 a=1,b=x求解
return 0;
}