话不多说 这题在递推与递归栏里,所有这题能用到递推或递归,打开题一看,这是一道递推题
题目:一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 mm 开始爬到蜂房 nn,m<nm<n,有多少种爬行路线?(备注:题面有误,右上角应为 n-1n−1)
输入格式
输入 m,nm,n 的值
输出格式
爬行有多少种路线
输入输出样例
输入
1 14
输出
377
说明/提示
对于100%的数据,M,N\le 1000M,N≤1000
第一次我没看到数据范围,以为一个longlong就可以带走她,没想到还是我太年轻。,这题是递推,除了前两个点,其余每一个点的到达次数都可以由前面两个点的到达次相加,所有可以创造一个全局变量二维数组a【1002】【1002】;和默认长度1;
输入起始位置m和终止位置n,所有走过的路程为n-m+1个点,先初始化a[1][0]=1;(默认a[0][0]=1,但是其实没有必要写) ,a[2][0]=2;其余每个点的次数都有前面两个决定,
eg:
第temp个点,a[temp][]=a[temp-1][]+a[temp-2][];(这个代码肯定是不规范的,但是为了让你们理解这个意思)对了,由于数据范围,这里需要高精度,不说了,直接上代码。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1002][1002];//定义二维数组
int len = 1//默认长度为1
void fun(int temp)
{
for (int i = 0; i <= len - 1; i++)
{
a[temp][i] += a[temp - 1][i] + a[temp - 2][i];//一定要注意是+=,而不是等于
if (a[temp][i] >= 10)
{
a[temp][i + 1] += a[temp][i] / 10;
a[temp][i] %= 10;
}
}
if (a[temp][len])len++;//进位
}
int main()
{
int m, n;
cin >> m >> n;
a[1][0] = 1;
a[2][0] = 2;//默认初始值第二个和第三个点
for (int i = 3; i <= n-m; i++)
{
fun(i);
}
//cout << a[n - m][0] << endl;
for (int i = len-1; i>=0; i--)//逆序输出
{
cout << a[n - m][i];
}
cout << endl;
return 0;
}
写题解不易,点个赞再走吧!!!!!!!!!!!!!!