1. 程式人生 > >PAT 蜜蜂尋路 (遞推) - 詳細題解

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