题解:洛谷 P5732 杨辉三角
【题目来源】
【题目描述】
给出 \(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
【核心思想】
-
问题分析:给定 \(n\)(\(1 \le n \le 20\)),要求输出杨辉三角的前 \(n\) 行。杨辉三角具有以下性质:每行首尾元素均为 1,其余每个元素等于其正上方元素与左上方元素之和。本质是一个递推填充问题,可以使用二维数组按行从上到下计算。
-
算法选择:
- 递推法:使用二维数组
a[i][j]存储第 \(i\) 行第 \(j\) 列的值(从 1 开始计数)。初始化a[1][1] = 1,然后按行递推:对于第 \(i\) 行,a[i][1] = 1,a[i][i] = 1(或由递推自动得到),中间元素a[i][j] = a[i-1][j] + a[i-1][j-1]。 - 滚动数组优化(可选):由于递推只依赖上一行,可以使用一维数组从后向前更新,但 \(n \le 20\) 时二维数组更直观。
- 递推法:使用二维数组
-
关键步骤:
- 读入:读取 \(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\) 个数字,用空格分隔。
-
时间/空间复杂度:
- 时间复杂度:\(O(n^2)\),需要计算所有元素。
- 空间复杂度:\(O(n^2)\),用于存储矩阵。
-
递推与组合数学:
- 杨辉三角与组合数:杨辉三角第 \(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
浙公网安备 33010602011771号