1 条题解
-
0
📝 题目大意
给定整数 ,输出杨辉三角(Pascal's Triangle)的前 行。第 行()有 个数,首尾为 ,中间每个数等于其左上和右上的两数之和。
💡 解题思路
-
题目分析:,数据量极小,直接模拟即可。递推公式 正是杨辉三角的核心定义。
-
算法推导:
- 使用二维数组
a[35][35](1-indexed),足够容纳 的情况。 - 初始化边界:对于每一行 (),令
a[i][1] = 1(首列)和a[i][i] = 1(对角线),对应题目中 或 时值为 的条件。 - 递推中间值:从第 行开始(),因为前两行只有边界值无需计算。对于 ,执行
a[i][j] = a[i-1][j-1] + a[i-1][j],这正是题目中 的 1-indexed 表示。 - 输出:按行输出,每行元素以空格分隔,行末换行。
- 使用二维数组
-
边界与细节:
- 数组从 开始索引,与题目描述的 -indexed 不同,但输出结果一致。
- 注意行末空格的处理:代码中
printf("%d ", a[i][j])会在每个数后输出空格(包括行末),在 AtCoder 判题系统中行末空格是允许的,不会导致 WA。 - 或 时,递推循环
for(int i=3;i<=n;i++)不会执行,直接输出前两行的边界值即可,无需特殊处理。
⏱️ 复杂度分析
- 时间复杂度:,两层循环填充 行,每行最多 个元素。
- 空间复杂度:,存储整个杨辉三角的二维数组。
💻 标准代码 (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
- 上传者