题目
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为 n-1)
题目分析
每个方块可以由相邻且小于该数的方块转移,例如当n=1 m=4时方案数为 由1到3的方案,加上由1到2的方案,这样的原因是因为2与3有且只有一步到达目的地4
我们很容易可以想到斐波那契数列,用一维数组f[n]来储存由起点到距离n位置的方案数,答案就是f[n-m].
分析易得f[0]=0,f[1]=1,f[2]=2;得到递推式子f[n]=f[n-1]+f[n-2];
但是当n的值过大时方案数将会爆longlong,所以可以使用高精度加法来实现这一过程.如代码所示
#include<iostream>
using namespace std;
int f[1005][1005],len=1;//第一维代表数字,第二维代表数字的每一位数如f[2][1]=2代表第f[2]的个位为2
void add(int x)//二维数组高进度加
{
for (int i = 1; i <= len; i++)
f[x][i] = f[x - 1][i] + f[x - 2][i];//处理每一位数加
for (int i = 1; i <= len; i++)//从个位开始处理进位
if (f[x][i] > 9)
{
f[x][i + 1] += f[x][i] / 10;
f[x][i] %= 10;
}
if (f[x][len + 1]) len++;//判断数的位数是否边长
}
int main()
{
int n,m;
cin >> n >> m;
f[0][1]=0,f[1][1] = 1, f[2][1] = 2;
for (int i = 3; i <= m-n; i++)
{
add(i);
}
for (int i = len; i >= 1; i--)
cout << f[m-n][i];
}