1. 程式人生 > 其它 >P2437 蜜蜂路線題解

P2437 蜜蜂路線題解

思路分析:

1、以普通的第\(i\)個蜂房進行思考,將它的狀態描述為:\(f[i]\),這是一個一維陣列。它可以由哪些狀態轉移過來?由題意,可以從\(i-1\),\(i-2\)而來。
根據加法原理有\(f[i]=f[i-1]+f[i-2]\),其中\(i>2\),而\(f[1]=f[2]=1\)
這就是一個斐波那契數列啊!

2、看一下資料量,\(M<=N<=1000\),我們知道,\(1000\)極限值的斐波那契數列可不是一個小數字,\(int\)肯定暴掉,\(long\ long\)也是白費,\(usinged\ long \ long\)可以一試,根本還是高精度加法。

c++ 程式碼

#include <bits/stdc++.h>

using namespace std;
//高精度+裴波那契數列
//本題目考點:
//1、遞推
//2、遞推關係式的推導:找出任意一個位置,思考它是怎麼來的,再用加法原理。
vector<int> add(vector<int> &A, vector<int> &B) {
    if (A.size() < B.size()) return add(B, A);
    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i++) {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(t);
    return C;
}

int main() {
    int m, n;
    cin >> m >> n;
    vector<int> A, B, C;
    A.push_back(1);
    B.push_back(1);

    for (int i = 3; i <= n - m + 1; i++) {
        C = add(A, B);
        //對加數需要重新賦值
        //A<---B
        A.assign(B.begin(), B.end());
        //B<---C
        B.assign(C.begin(), C.end());
    }
    //倒序輸出結果
    for (int i = B.size() - 1; i >= 0; i--)printf("%d", B[i]);

    return 0;
}