题解:洛谷 P5732 杨辉三角

【题目来源】

洛谷:P5732 【深基5.习7】杨辉三角 - 洛谷

【题目描述】

给出 \(n(1\le n\le 20)\),输出杨辉三角的前 \(n\) 行。

如果你不知道什么是杨辉三角,可以观察样例找找规律。

【输入】

【输出】

【输入样例】

6

【输出样例】

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

【核心思想】

  1. 问题分析:给定 \(n\)\(1 \le n \le 20\)),要求输出杨辉三角的前 \(n\) 行。杨辉三角具有以下性质:每行首尾元素均为 1,其余每个元素等于其正上方元素与左上方元素之和。本质是一个递推填充问题,可以使用二维数组按行从上到下计算。

  2. 算法选择

    • 递推法:使用二维数组 a[i][j] 存储第 \(i\) 行第 \(j\) 列的值(从 1 开始计数)。初始化 a[1][1] = 1,然后按行递推:对于第 \(i\) 行,a[i][1] = 1a[i][i] = 1(或由递推自动得到),中间元素 a[i][j] = a[i-1][j] + a[i-1][j-1]
    • 滚动数组优化(可选):由于递推只依赖上一行,可以使用一维数组从后向前更新,但 \(n \le 20\) 时二维数组更直观。
  3. 关键步骤

    • 读入:读取 \(n\)
    • 初始化与递推
      • 将数组 a[25][25] 初始化为 0。
      • 外层循环 \(i\) 从 1 到 \(n\)(行索引):
        • a[i][1] = 1(每行第一个元素为 1)。
        • 内层循环 \(j\) 从 2 到 \(i\)(列索引):
          • a[i][j] = a[i-1][j] + a[i-1][j-1]
      • 注意:当 \(j = i\) 时,a[i-1][i] 为 0(因为上一行没有该列),a[i-1][i-1] = 1,所以得到 1,符合每行最后一个元素为 1。
    • 输出:按行输出,第 \(i\) 行输出 \(i\) 个数字,用空格分隔。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n^2)\),需要计算所有元素。
    • 空间复杂度:\(O(n^2)\),用于存储矩阵。
  5. 递推与组合数学

    • 杨辉三角与组合数:杨辉三角第 \(i\) 行第 \(j\) 列的值等于组合数 \(C(i-1, j-1)\),但递推法直接利用加法性质计算。
    • 边界处理:每行第一个和最后一个元素均为 1,递推公式中通过数组初始化为 0 和边界条件自然满足。
    • 输出格式:按行输出,每个数字后跟一个空格,行末换行。
    • 适用场景:杨辉三角是递推算法的经典入门题,也常用于练习二维数组操作。

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

int main()
{
    int n;               // 定义变量:杨辉三角的行数
    int a[25][25] = {0}; // 定义二维数组:存储杨辉三角,初始化为0

    cin >> n;            // 输入杨辉三角的行数

    // 创建杨辉三角
    for (int i = 1; i <= n; i++)
    {
        a[i][1] = 1;     // 每行的第一个元素为1

        // 计算每行中间的元素(从第二个到第i个)
        for (int j = 2; j <= i; j++)
        {
            // 杨辉三角的性质:当前元素等于上方元素加上左上方元素
            a[i][j] = a[i-1][j] + a[i-1][j-1];
        }
    }

    // 输出杨辉三角
    for (int i = 1; i <= n; i++)
    {
        // 输出每行的元素(第i行有i个元素)
        for (int j = 1; j <= i; j++)
        {
            cout << a[i][j] << " ";  // 输出当前元素加空格
        }
        cout << endl;                // 每行结束换行
    }

    return 0;                        // 程序正常结束
}

【运行结果】

6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
posted @ 2026-08-30 09:17  团爸讲算法  阅读(24)  评论(0)    收藏  举报