1 条题解

  • 0
    @ 2026-6-19 10:30:07

    📝 题目大意

    给定整数 NN,输出杨辉三角(Pascal's Triangle)的前 NN 行。第 ii 行(0i<N0 \le i < N)有 i+1i+1 个数,首尾为 11,中间每个数等于其左上和右上的两数之和。

    💡 解题思路

    1. 题目分析N30N \le 30,数据量极小,直接模拟即可。递推公式 ai,j=ai1,j1+ai1,ja_{i,j}=a_{i-1,j-1}+a_{i-1,j} 正是杨辉三角的核心定义。

    2. 算法推导

      • 使用二维数组 a[35][35](1-indexed),足够容纳 N30N \le 30 的情况。
      • 初始化边界:对于每一行 ii1iN1 \le i \le N),令 a[i][1] = 1(首列)和 a[i][i] = 1(对角线),对应题目中 j=0j=0j=ij=i 时值为 11 的条件。
      • 递推中间值:从第 33 行开始(i=3i=3),因为前两行只有边界值无需计算。对于 j[2,i1]j \in [2, i-1],执行 a[i][j] = a[i-1][j-1] + a[i-1][j],这正是题目中 ai,j=ai1,j1+ai1,ja_{i,j}=a_{i-1,j-1}+a_{i-1,j} 的 1-indexed 表示。
      • 输出:按行输出,每行元素以空格分隔,行末换行。
    3. 边界与细节

      • 数组从 11 开始索引,与题目描述的 00-indexed 不同,但输出结果一致。
      • 注意行末空格的处理:代码中 printf("%d ", a[i][j]) 会在每个数后输出空格(包括行末),在 AtCoder 判题系统中行末空格是允许的,不会导致 WA。
      • N=1N=1N=2N=2 时,递推循环 for(int i=3;i<=n;i++) 不会执行,直接输出前两行的边界值即可,无需特殊处理。

    ⏱️ 复杂度分析

    • 时间复杂度O(N2)O(N^2),两层循环填充 NN 行,每行最多 NN 个元素。
    • 空间复杂度O(N2)O(N^2),存储整个杨辉三角的二维数组。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int a[35][35]; // 杨辉三角数组,1-indexed,N≤30 足够
    int main()
    {
        int n; scanf("%d", &n);
        // 初始化边界:每行首尾为 1
        for(int i = 1; i <= n; i++)
        {
            a[i][i] = 1; // 对角线(j = i 时,对应题目 j = i)
            a[i][1] = 1; // 首列(j = 0 时,对应题目 j = 0)
        }
        // 递推填充中间值:a[i][j] = a[i-1][j-1] + a[i-1][j]
        for(int i = 3; i <= n; i++) // 前两行无需计算
        {
            for(int j = 2; j <= i - 1; j++)
            {
                a[i][j] = a[i-1][j-1] + a[i-1][j];
            }
        }
        // 逐行输出杨辉三角
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= i; j++)
            {
                printf("%d ", a[i][j]); // AtCoder 允许行末空格
            }
            printf("\n");
        }
        return 0;
    }
    
    • 1

    信息

    ID
    600
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者