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;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/83995841