• 蓝桥备赛——矩阵读入


    题目描述 

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

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

    二维列表推导式

    1. n, m, k = map(int, input().split())
    2. mat = []
    3. for i in range(n):
    4. mat.append(list(map(int, input().split())))
    5. pre = [[0 for _ in range(m)] for _ in range(n + 1)]
    6. for i in range(1, n + 1):
    7. for j in range(m):
    8. pre[i][j] = pre[i - 1][j] + mat[i - 1][j]

     可以看到上面代码的

    pre = [[0 for _ in range(m)] for _ in range(n + 1)]
    

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

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

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

    自创的方法

    1. n,m,k=map(int,input().split())
    2. mas=[]
    3. for i in range(n):
    4. matrix = []
    5. matrix.extend(map(int,input().split()))
    6. mas.append(matrix)
    7. print(mas)

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

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

    AC Code

    1. n, m, k = map(int, input().split())
    2. mat = []
    3. for i in range(n):
    4. mat.append(list(map(int, input().split())))
    5. pre = [[0 for _ in range(m)] for _ in range(n + 1)]
    6. for i in range(1, n + 1):
    7. for j in range(m):
    8. pre[i][j] = pre[i - 1][j] + mat[i - 1][j]
    9. ans = 0
    10. for i in range(n):
    11. for j in range(i, n):
    12. l, r, sum = 0, 0, 0
    13. while r < m:
    14. sum += pre[j + 1][r] - pre[i][r]
    15. while sum > k:
    16. sum -= pre[j + 1][l] - pre[i][l]
    17. l += 1
    18. ans += r - l + 1
    19. r += 1
    20. print(ans)

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

    1. n, m, k = map(int, input().split())
    2. mat = []
    3. for i in range(n):
    4. mat.append(list(map(int, input().split())))
    5. pre = [[0 for _ in range(m)] for _ in range(n + 1)]
    6. for i in range(1, n + 1):
    7. for j in range(m):
    8. pre[i][j] = pre[i - 1][j] + mat[i - 1][j]

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

    1. ans = 0
    2. for i in range(n):
    3. for j in range(i, n):
    4. l, r, sum = 0, 0, 0
    5. while r < m:
    6. sum += pre[j + 1][r] - pre[i][r]
    7. while sum > k:
    8. sum -= pre[j + 1][l] - pre[i][l]
    9. l += 1
    10. ans += r - l + 1
    11. r += 1
    12. 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),因为有三层嵌套循环分别遍历行、列和子矩阵。

     

  • 相关阅读:
    【JavaWeb】Filter
    期刊会议排名、信息检索网站推荐以及IEEE Latex模板下载
    超全Chat GPT论文修改指令
    CMake篇1: Windows上用CMake编译生成可执行程序
    计算机毕业设计springboot+vue+elementUI 广场舞团高校舞蹈社团管理系统
    【React】Redux基本使用
    Linux命令200例:free用来显示系统内存使用情况
    爬虫,用scrapy的xpath来解析链家
    一种新的群体智能优化算法:麻雀搜索算法(SSA)(Matlab代码实现)
    今年十八,喜欢SQL注入
  • 原文地址:https://blog.csdn.net/weixin_60535956/article/details/137206629