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;
}
原文地址:https://www.cnblogs.com/littlehb/p/15026084.html