您的位置:首页 > 其它

DP Problem J:一只小蜜蜂(HDU 2044)

2018-03-28 22:46 316 查看
Problem JTime Limit : 2000/1000ms (Java/Other)   Memory Limit :65536/32768K (Java/Other)Total Submission(s) : 11   Accepted Submission(s) : 3

Problem Description

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。 
其中,蜂房的结构如下所示。 

Input

输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0

Output

对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。

Sample Input


1 2 
3 6

Sample Output


3

算法分析:

两种做法:1.斐波那契数列。          2.二维DP二维dp,就是把它换成二维的数组,1 3 5 7 9 ……..2 4 6 8 10……..f[i][j]为从起点到(i,j)的方法数量,根据规则得出状态转移方程:if(i==1)f[i][j]+=(f[i][j-1]+f[i+1][j-1]);if(i==2)f[i][j]+=(f[i][j-1]+f[i-1][j]);代码实现:#include<bits/stdc++.h>
using namespace std ;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m,i,j,x1,y1,x2,y2;
scanf("%d%d",&n,&m);
if(n==m)
{
printf("0\n");
}
else if(m-n==1)
{
printf("1\n");
}
else
{
//换成坐标
if(n%2==0)
{x1=2;
y1=n/2;}
else
{
x1=1;
y1=(n+1)/2;
}
if(m%2==0)
{x2=2;
y2=m/2;}
else
{
x2=1;
y2=(m+1)/2;
}

long long int f[3][30];//注意数据过大,必须ll
memset(f,0,sizeof(f));
f[x1][y1]=1; //初始化

for(j=y1;j<=y2+1;j++)
{
for(i=x1;i<=2;i++)
{
if(x1==2) x1--; //注意,不然一直i==2
4000
if(i==1)f[i][j]+=(f[i][j-1]+f[i+1][j-1]);
if(i==2)f[i][j]+=(f[i][j-1]+f[i-1][j]);
}
}

cout<<f[x2][y2]<<endl;
}
}
}

斐波那契数列做法是题解发现的,好像是正规做法。规律啊,无敌啊。代码实现: #include<bits/stdc++.h>
using namespace std;
int main()
{
long long int f[52];//后来的数很大
f[1]=1;f[2]=2;
for(int i=3;i<=52;i++)
f[i]=f[i-1]+f[i-2];
int T,n,m;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
cout<<f[m-n]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: