P2437 蜜蜂路線題解
阿新 • • 發佈:2021-07-18
思路分析:
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; }