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
其中,蜂房的结构如下所示。
1 2
3 6
3
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;
}
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。其中,蜂房的结构如下所示。
Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0Output
对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。Sample Input
21 2
3 6
Sample Output
13
算法分析:
两种做法: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;
}
相关文章推荐
- hdu2044 一只小蜜蜂...
- Hdu 2044 一只小蜜蜂 简单DP
- hdu 2044 一只小蜜蜂... (递推)
- HDU 2044.一只小蜜蜂【水题】【11月28】
- HDU(2044)(一只小蜜蜂……)
- HDU 2044 一只小蜜蜂
- (step3.1.2)hdu 2044(一只小蜜蜂...)
- hdu2044 一只小蜜蜂
- HDU-OJ 2044 一只小蜜蜂
- hdu 2044 一只小蜜蜂...
- hdu 2044一只小蜜蜂...(斐波那契数列)递推
- HDU 2044 一只小蜜蜂... 递推
- HDU - 2044 一只小蜜蜂...
- hdu 2044 一只小蜜蜂
- 动态规划 HDU - 2044 一只小蜜蜂
- HDu 2044一只小蜜蜂...
- HDU 2044 一只小蜜蜂...
- HDU-2044 - 一只小蜜蜂... - 斐波那契
- HDU 2044 一只小蜜蜂...
- hdu 2044 一只小蜜蜂