【深基5.习7】杨辉三角

GitHub跳转原题关系图返回列表

逐行构造杨辉三角,边界为 1,中间元素等于上一行相邻两个数之和。

OJ: luogu

题目 ID: P5732

难度:入门

标签:模拟矩阵递推python

日期: 2026-07-15 18:58

题意

输入 n,输出杨辉三角前 n 行。

思路

杨辉三角每一行两端都是 1。中间位置由上一行相邻两个数相加得到:

text
current[col] = previous[col - 1] + previous[col]

因此可以从第 0 行开始逐行构造。每次先创建长度为 row + 1、全是 1 的列表,再填中间位置。

这题是二维列表和递推入门,正解已经直接对应定义,不创建 brute.py

Python 知识

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:使用 int(input()) 读取单个整数,使用 print(*row) 输出一行数字。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:多行输出可以逐行 print
  • current = [1] * (row + 1) 创建当前行。
  • range(1, row) 只枚举当前行的中间位置。

代码

python
n = int(input())

triangle = []

for row in range(n):
    current = [1] * (row + 1)
    for col in range(1, row):
        current[col] = triangle[row - 1][col - 1] + triangle[row - 1][col]
    triangle.append(current)

for row in triangle:
    print(*row)
cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-27 00:00
 * update_at: 2026-07-27 00:00
 */

#include <bits/stdc++.h>
using namespace std;

int a[25][25]; // a[row][col] 存储杨辉三角
int n;

int main() {
    cin >> n;
    for (int r = 1; r <= n; r++) {
        a[r][1] = 1;       // 第一列始终为 1
        a[r][r] = 1;       // 对角线始终为 1
        // 中间元素等于上一行相邻两个数之和
        for (int c = 2; c < r; c++) {
            a[r][c] = a[r - 1][c - 1] + a[r - 1][c];
        }
    }
    for (int r = 1; r <= n; r++) {
        for (int c = 1; c <= r; c++)
            cout << a[r][c] << " ";
        cout << "\n";
    }
    return 0;
}

Pythonic 写法

由上一行用列表推导生成当前行中间元素:

python
n = int(input())
triangle = [[1]]
for row in range(1, n):
    prev = triangle[-1]
    triangle.append([1] + [prev[i] + prev[i + 1] for i in range(row - 1)] + [1])
for row in triangle:
    print(*row)

复杂度

一共输出约 n^2/2 个数字,时间复杂度是 O(n2)O(n^2),保存三角形需要 O(n2)O(n^2) 空间。

总结

杨辉三角的关键是“边界为 1,中间来自上一行”。逐行构造最适合入门学习。