查看: 30|回复: 0

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

[复制链接]
  • TA的每日心情

    昨天 14:37
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    15

    主题

    0

    回帖

    22

    积分

    新手上路

    Rank: 1

    积分
    22
    发表于 7 天前 | 显示全部楼层 |阅读模式

    一、问题描述与递推关系建立

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

    二、高精度加法实现原理

    在C++中实现高精度加法需要将大数用数组存储,每个元素表示数字的一位。1234可存储为[4,3,2,1]以便于进位处理。具体实现时要注意三个关键点:数组逆序存储简化运算、按位相加处理进位、结果数组的长度动态调整。如何确保加法运算的正确性?我们需要逐位相加并处理进位标志,反向输出结果。这个过程中,carry变量的处理尤为关键,它记录着当前位的进位值,需要加到下一位的计算中。特别要注意最高位可能产生的额外进位情况。

    三、动态规划的空间优化

    传统动态规划会使用O(n)空间存储所有中间结果,但对于斐波那契类问题,我们只需要前两个状态即可。这引出了滚动数组的优化技巧:仅用三个变量交替存储f(n-2)、f(n-1)和f(n)。为什么这种优化有效?因为递推公式只依赖前两项,与更早的结果无关。在代码实现中,我们可以用二维数组的第二维作为滚动索引,或者直接使用三个高精度数组交替存储。这种优化将空间复杂度从O(n)降到了O(1),在处理大规模数据时优势明显。

    四、完整C++代码实现
    1. #include <iostream>
    2. #include <vector>
    3. using namespace std;

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

    16. int main() {
    17.     int n;
    18.     cin >> n;
    19.    
    20.     // 边界条件处理
    21.     if(n == 0) {
    22.         cout << 0;
    23.         return 0;
    24.     }
    25.    
    26.     // 初始化滚动数组(逆序存储:个位在[0])
    27.     vector<int> f[3] = {{1}, {1}, {}};
    28.    
    29.     // 动态规划递推
    30.     for(int i = 2; i <= n; i++) {
    31.         f[i%3] = add(f[(i-1)%3], f[(i-2)%3]);
    32.     }
    33.    
    34.     // 逆序输出结果
    35.     for(int i = f[n%3].size()-1; i >= 0; i--) {
    36.         cout << f[n%3][i];
    37.     }
    38.     return 0;
    39. }
    复制代码

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表