洛谷——P2437 蜜蜂路线
P2437 蜜蜂路线 - 洛谷
题目描述
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m 开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为 n−1)
输入格式
输入 m,n 的值
输出格式
爬行有多少种路线
最初的思路,我认为就是一个递推dp[i] = dp[i - 1] + dp[i - 2]。于是代码就有了
#include <iostream>
using namespace std;
int main() {int n, m;cin >> n >> m;int dp[m + 1] = {};dp[1] = 0;dp[2] = 1;for(int i = 3; i < m + 1; i ++) {dp[i] = dp[i - 1] + dp[i - 2];}cout << dp[m] - dp[n];return 0;
}
结果案例一个没过。后来感觉是高精度的问题于是代码又来了
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
vector<int> ans;
void add(vector<int>& a, vector<int>& b) {int x = 0;for(int i = 0; i < a.size(); i ++) {x = x + a[i] + b[i];a[i] = x % 10;x = x / 10;}for(int i = a.size(); i < b.size(); i ++){x = x + b[i];a.push_back(x % 10);x = x / 10;}if(x) {a.push_back(x % 10);x = x / 10;}vector<int> c = a;a = b;b = c;
}
void cul(vector<int> & a, vector<int> & b) {for(int i = 0; i < b.size(); i ++) {int t = a[i] - b[i];if(t < 0) {t += 10;a[i + 1] -= 1;}ans.push_back(t);}for(int i = b.size(); i < a.size(); i ++) {ans.push_back(a[i]);}
}
int main() {int n, m;cin >> n >> m;vector<int> a, b;vector<int> M;a.push_back(1);b.push_back(2);if(n < 4) {M.push_back(n - 1);}for(int i = 4; i < m + 1; i ++) {add(a, b);if(i == n) M = b;}cul(b, M);for(int i = ans.size() - 1; i >= 0; i --) cout << ans[i];return 0;
}
过了几个案例但是还有错误,继续改发现在斐波那契数列中从a点到b点(a < b)的方案数目等于dp[b - a]的值所以代码就是
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
void add(vector<int>& a, vector<int>& b) {int x = 0;for(int i = 0; i < a.size(); i ++) {x = x + a[i] + b[i];a[i] = x % 10;x = x / 10;}for(int i = a.size(); i < b.size(); i ++){x = x + b[i];a.push_back(x % 10);x = x / 10;}if(x) {a.push_back(x % 10);x = x / 10;}vector<int> c = a;a = b;b = c;
}int main() {int n, m;cin >> n >> m;int k = m - n;vector<int> a, b;a.push_back(1);b.push_back(2);if(k == 1) {cout << 1 << '\n';return 0;}if(k == 2) {cout << 2 << '\n';return 0;}for(int i = 3; i < k + 1; i ++) {add(a, b);}for(int i = b.size() - 1; i >= 0; i --) cout << b[i];return 0;
}