洛谷P1255题 解题思路和步骤 C++实现带注释,c++入门基础题

贾蔷
• 阅读 60

洛谷P1255题 解题思路和步骤 C++实现带注释,c++入门基础题 一、问题描述与递推关系建立

洛谷P1255数楼梯问题要求计算n级台阶的不同走法数,每次可以跨1级或2级。这本质上是斐波那契数列的变种问题,递推公式为f(n)=f(n-1)+f(n-2)。当n≤50时可用普通整型存储,但题目中n可能达到5000,这就必须使用高精度运算来处理大数。为什么说这个问题需要特殊处理呢?因为普通数据类型的存储范围根本无法容纳如此大的数值。我们需要建立清晰的递推思维:第n级台阶的走法数等于从n-1级跨1步上来,加上从n-2级跨2步上来的走法数之和。

二、完整C++代码实现

#include <iostream>
#include <vector>
using namespace std;

// 高精度加法(逆序存储的数字)
vector<int> add(vector<int>& a, vector<int>& b) {
    vector<int> c;
    int carry = 0;
    for(int i = 0; i < a.size() || i < b.size() || carry; i++) {
        if(i < a.size()) carry += a[i];
        if(i < b.size()) carry += b[i];
        c.push_back(carry % 10);
        carry /= 10;
    }
    return c;
}

int main() {
    int n;
    cin >> n;

    // 边界条件处理
    if(n == 0) {
        cout << 0;
        return 0;
    }

    // 初始化滚动数组(逆序存储:个位在[0])
    vector<int> f[3] = {{1}, {1}, {}};

    // 动态规划递推
    for(int i = 2; i <= n; i++) {
        f[i%3] = add(f[(i-1)%3], f[(i-2)%3]);
    }

    // 逆序输出结果
    for(int i = f[n%3].size()-1; i >= 0; i--) {
        cout << f[n%3][i];
    }
    return 0;
}

三、代码关键点解析

代码中高精度加法的实现采用vector容器存储数字各位,通过carry变量处理进位。主函数中使用f[3]的滚动数组来优化空间,模3运算实现状态轮转。边界条件n=0时需要特殊处理,因为题目规定楼梯级数从0开始。输出时要注意数字是逆序存储的,所以需要从高位到低位反向输出。为什么采用%3的模运算?这创造了一个循环使用的存储空间,三个位置足够存储当前需要的三个连续状态,实现了空间复用。

原文:洛谷P1255题 解题思路和步骤 C++实现带注释,c++入门基础题

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Python递归函数、匿名函数、过滤函数
递归函数Python对递归的深度有限制,超过即会报错。所以一定一要注意跳出条件。斐波拉契数列一个数列,第一个数是1,第二个数也是1,从第三个数开始,每一个数是前两个数之和公式:f(1)1,f(2)1,f(3)f(1)f(2),...,f(n)f(n2)f(n1)
Wesley13 Wesley13
3年前
Java面试不得不知的程序(二)
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?斐波那契数列:前面相邻两项之和,构成了后一项通项公式注:此时a11,a21,ana(n1)a(n2)(n3,n∈N\)通项公式的推导斐波那契数列:1、1
Stella981 Stella981
3年前
HDOJ1021题 Fibonacci Again 应用求模公式
ProblemDescriptionThereareanotherkindofFibonaccinumbers:F(0)7,F(1)11,F(n)F(n1)F(n2)(n2).InputInputconsistsofasequenceoflines,eachcontaini
贾蔷 贾蔷
6天前
2023年GESP六级小杨握手问题(洛谷B3874):Fenwick树求解逆序对的代码解析
一、题目解读“小杨的握手问题”源自2023年GESP六级考试(对应洛谷题目B3874)。题目描述为:给定一个长度为N的排列,每次将当前数与之前未访问过的数握手,求总共握手次数。本质上是求排列中逆序对的个数,即统计每个数右侧比它小的元素数量。需设计高效算法在
贾蔷 贾蔷
6天前
牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)
一、题目解读牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n1条边构成,保证为连通无环图。理解题目核心在于准确获取树的拓扑关系,并设计算法遍历
深度学习 深度学习
6天前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
深度学习 深度学习
3天前
动态规划进阶:牛客4802题带附件背包问题详解 | 组合优化技巧
一、问题背景与算法思路牛客4802题是一个典型的带附件的背包问题变种,要求在主件和附件存在依赖关系的情况下,选择物品组合使总价值最大化。本文通过动态规划方法,将问题转化为分组背包问题,通过预处理所有可能的组合方式来实现高效求解。二、完整代码实现(带详细注释
深度学习 深度学习
1天前
2012年NOIP提高组「借教室」(洛谷P1083)解题思路与二分查找优化代码解析
一、题目解读本题为2012年NOIP提高组中的「借教室」问题(洛谷P1083),要求处理教室借用订单的分配问题。给定n天每天可用教室数量r和m个订单(订单包含需求教室数d、开始日期s、结束日期t),判断能否通过删除部分订单使所有订单满足教室容量限制。若能,
菜园前端 菜园前端
1年前
什么是动态规划?
原文链接:什么是动态规划?动态规划也是算法设计的一种方法/思想。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题。基础案例场景一斐波那契数列当前数等于前面两个数的和。定义子问题:f(n)f(n1)f(n2)
贾蔷 贾蔷
1个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们