P2437 蜜蜂路线题解

时间:2021-07-18
本文章向大家介绍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;
}

原文地址:https://www.cnblogs.com/littlehb/p/15026084.html