蓝桥备赛——矩阵读入

题目描述

如上图所示,是一道有关二维前缀和的问题,因为涉及到二维,肯定就是以矩阵的形式进行读入的。

为此,针对矩阵的读入形式进行总结,可以大致总结出两种类型如下:

二维列表推导式

python 复制代码
n, m, k = map(int, input().split())
mat = []
for i in range(n):
    mat.append(list(map(int, input().split())))
pre = [[0 for _ in range(m)] for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(m):
        pre[i][j] = pre[i - 1][j] + mat[i - 1][j]

可以看到上面代码的

python 复制代码
pre = [[0 for _ in range(m)] for _ in range(n + 1)]

表示的是对于第一个 中的元素是生成一个行向量,对于外面的第二个 表示的是生成多少行的列表。

经过上面的代码,可以获得一个列表为

即获得了一个所有元素都为0的列表。后面再不停地读入元素进行原内容覆盖。

自创的方法

python 复制代码
n,m,k=map(int,input().split())
mas=[]
for i in range(n):
    matrix = []
    matrix.extend(map(int,input().split()))
    mas.append(matrix)
print(mas)

同样是先读入数据,不过需要额外创建一个列表作为中转,将数据读入后,再将其作为整体append到一个新的列表,即可达到上面二维列表推导式的效果。

与上面方法不同的地方是,不需要再重新将元素全部覆盖,所录入列表的即为最终数据。

AC Code

python 复制代码
n, m, k = map(int, input().split())
mat = []
for i in range(n):
    mat.append(list(map(int, input().split())))
pre = [[0 for _ in range(m)] for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(m):
        pre[i][j] = pre[i - 1][j] + mat[i - 1][j]
ans = 0
for i in range(n):
    for j in range(i, n):
        l, r, sum = 0, 0, 0
        while r < m:
            sum += pre[j + 1][r] - pre[i][r]
            while sum > k:
                sum -= pre[j + 1][l] - pre[i][l]
                l += 1
            ans += r - l + 1
            r += 1
print(ans)

现在来解释一下上面的代码

python 复制代码
n, m, k = map(int, input().split())
mat = []
for i in range(n):
    mat.append(list(map(int, input().split())))
pre = [[0 for _ in range(m)] for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(m):
        pre[i][j] = pre[i - 1][j] + mat[i - 1][j]

这块代码的作用就是读入相关数据

python 复制代码
ans = 0
for i in range(n):
    for j in range(i, n):
        l, r, sum = 0, 0, 0
        while r < m:
            sum += pre[j + 1][r] - pre[i][r]
            while sum > k:
                sum -= pre[j + 1][l] - pre[i][l]
                l += 1
            ans += r - l + 1
            r += 1
print(ans)

上面代码的作用就是对应:

for i in range(1, n + 1): for j in range(m): pre[i][j] = pre[i - 1][j] + mat[i - 1][j]:计算前缀和矩阵pre。对于pre[i][j],表示原始矩阵中第i-1行(因为前缀和矩阵行数比原始矩阵多了1)以及前j列的元素之和。

ans = 0:初始化变量ans,用于记录满足条件的子矩阵数量。

for i in range(n): for j in range(i, n)::遍历所有可能的子矩阵的上边界i和下边界j

l, r, sum = 0, 0, 0:初始化左边界l、右边界r以及子矩阵元素之和sum

while r < m: sum += pre[j + 1][r] - pre[i][r]:在子矩阵的右边界r小于列数m时,计算子矩阵在当前列的元素之和。

while sum > k: sum -= pre[j + 1][l] - pre[i][l] l += 1:如果子矩阵的元素之和超过了限定值k,则移动左边界l,直到子矩阵的元素之和不再超过k

ans += r - l + 1:更新满足条件的子矩阵数量。

r += 1:向右移动子矩阵的右边界r

print(ans):输出满足条件的子矩阵数量。

该算法的时间复杂度为O(n^3 * m),因为有三层嵌套循环分别遍历行、列和子矩阵。

相关推荐
modest_laowang1 小时前
一个机器人中的配准问题
线性代数·机器人·配准
USB_ABC1 小时前
南京军区训练基地:混合矩阵赋能军事训练智慧化协同升级
矩阵·音视频
学究天人5 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
USB_ABC6 小时前
郑州建业地产:高清音视频矩阵构筑智慧社区全域物联管控体系
矩阵·音视频
USB_ABC7 小时前
济南航天五院:高清数字矩阵赋能卫星研发数据可视化精准管控
矩阵·音视频
学究天人7 小时前
数学公理体系大全:第四章 ZFC公理的形式化与构造演算
线性代数·数学建模·矩阵·动态规划·图论·抽象代数·拓扑学
AI科技星1 天前
特征值与特征向量不是矩阵特殊解,是变换矩阵下不改变生长方向、仅缩放体量的固有主螺旋脉络 -《全域数学vs传统数学:人类文明进阶200讲》第73讲
人工智能·线性代数·矩阵·数据挖掘·回归·乖乖数学·全域数学
学究天人1 天前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷7)
线性代数·矩阵·动态规划·概率论·图论·抽象代数·拓扑学
学究天人1 天前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷8)
线性代数·算法·机器学习·数学建模·动态规划·图论·抽象代数
USB_ABC1 天前
视频矩阵核心技术对比:模块化vs固定机箱、硬件帧同步vs软件同步怎么选
矩阵·音视频