0
点赞
收藏
分享

微信扫一扫

巧用lambda表达式构建各种“树”

sin信仰 04-04 20:00 阅读 1

题目描述 

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

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

二维列表推导式

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]

 可以看到上面代码的

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

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

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

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

自创的方法

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

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)

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

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)

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

 

举报

相关推荐

0 条评论