【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)

简介: 蜜蜂路线问题:蜜蜂从蜂房$m$到$n$($m<n$)按数字递增爬行。给定$m$和$n$,求路线数。示例:$m=1$,$n=14$,输出$377$。100%数据$1\leq m,n\leq1000$。使用斐波那契序列优化,高精度处理大数。代码实现斐波那契存储并动态规划求解。

蜜蜂路线

题目描述

一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 $m$ 开始爬到蜂房 $n$,$m<n$,有多少种爬行路线?(备注:题面有误,右上角应为 $n-1$)

输入格式

输入 $m,n$ 的值

输出格式

爬行有多少种路线

样例 #1

样例输入 #1

1 14

样例输出 #1

377

提示

对于100%的数据,$1 \le M,N\le 1000$

思路

f(x) = f(x - 1) + f(x - 2)
如果m == x或m + 1 == x,则f(x) = 1
数据过大,long long不够大,必须上高精度。

AC代码

#include <iostream>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 1005;

int n, m;
vector<int> mem[maxn];

vector<int> add(vector<int> v1, vector<int> v2) {
   
   
    vector<int> v3;
    vector<int>::iterator it1 = v1.begin();
    vector<int>::iterator it2 = v2.begin();
    for(; it1 != v1.end() && it2 != v2.end(); it1++, it2++) {
   
   
        int sum = *it1 + *it2;
        v3.push_back(sum);
    }
    for(; it1 != v1.end(); it1++) {
   
   
        v3.push_back(*it1);
    }
    for(; it2 != v2.end(); it2++) {
   
   
        v3.push_back(*it2);
    }
    vector<int>::iterator it3 = v3.begin();
    bool flg = false;
    for(; it3 != v3.end(); it3++) {
   
   
        if(*it3 > 9) {
   
   
            *it3 -= 10;
            if(it3 + 1 == v3.end()) {
   
   
                flg = true;
            } else {
   
   
                *(it3 + 1) += 1;
            }
        }
    }
    if(flg) {
   
   
        v3.push_back(1);
    }
    return v3;
}

void printv(vector<int> v) {
   
   
    vector<int>::reverse_iterator rit = v.rbegin();
    for(; rit != v.rend(); rit++) {
   
   
        cout << *rit;
    }
    cout << endl;
}

void f(int x) {
   
   
    if(!mem[x].empty()) {
   
   
        return;
    }
    if(m == x || m + 1 == x) {
   
   
        mem[x].push_back(1);
        return;
    }
    f(x - 1);
    f(x - 2);
    mem[x] = add(mem[x - 1], mem[x - 2]);
}

int main() {
   
   
    cin >> m >> n;
    f(n);
    printv(mem[n]);
    return 0;
}
目录
相关文章
|
6月前
|
C语言
快速幂+高精乘(填坑)洛谷1226+1045
快速幂+高精乘(填坑)洛谷1226+1045
|
算法 测试技术 C++
C++算法:美丽塔O(n)解法单调栈
C++算法:美丽塔O(n)解法单调栈
|
算法 Android开发 索引
LeetCode 周赛上分之旅 #44 同余前缀和问题与经典倍增 LCA 算法
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
81 0
|
5月前
|
存储
【洛谷 P1255】数楼梯 题解(递归+记忆化搜索+高精度)
这是一个使用动态规划解决的“数楼梯”问题。给定楼梯数`N`,求不同上楼方式的数量。程序通过递归函数`f()`计算,其中`f(x) = f(x - 1) + f(x - 2)`,初始条件`f(1) = 1`,`f(2) = 2`。考虑到数据规模可能很大,使用了高精度加法运算。样例输入`4`,输出`5`。代码中定义了一个存储中间结果的向量`mem`,并提供了一个用于显示高精度数的`printv()`函数。
88 0
|
6月前
动态规划记忆化搜索之滑雪
动态规划记忆化搜索之滑雪
|
算法 Android开发
LeetCode 周赛上分之旅 #38 结合排序不等式的动态规划
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
82 0
|
人工智能 算法 C++
洛谷 P1090 合并果子(贪心)
洛谷 P1090 合并果子(贪心)
133 0
|
6月前
|
算法 测试技术 C++
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
算法 Java 测试技术
LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
64 0
LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解
|
算法
算法简单题,吾辈重拳出击 - 动态规划之爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?