PAT 蜜蜂寻路 (递推) - 详细题解
这道题非常巧妙, 仔细理解一下行走的逻辑, 发现递推公式其实就是一个斐波那契数列
但是由于数据过大, 仅仅开int也开不了2^31那么多的数组, 在这里有两种思路
1. 在上网看的, 因为数据范围只有2^63, 其实开到102就足矣了
2. 我使用的, 用一个滚动数组来递推就好了
//蜜蜂寻路
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const LL maxn = 2147483648+5;
LL dp[3]; //滚动数组
int n, a, b;
LL solve()
{
ms(dp, 0);
dp[0] = 1, dp[1] = 1;
for(int i = 2; i < b-a+1; i++)
dp[i%3] = dp[0]+dp[1]+dp[2]-dp[i%3]; //即dp[i]=dp[i-1]+dp][i-2]
LL ans = 0;
for(int i = 0; i < 3; i++)
ans = max(dp[i], ans);
return ans;
}
int main()
{
cin >> n;
while(n--){
cin >> a >> b;
cout << solve() << endl; //从1到4和从2到5答案是一样的
}
return 0;
}