【算法实战】每日一题:如何解决二维矩阵和为最大值的情况

题目

给定一个1002x1002的网格,每个格子有一个权重值。需要从左上角移动到右下角,每次只能向右或向下移动一格,求路径上长度为R的正方形的权重值的最大和。

核心思路

首先构建一个累加数组(前缀和数组),它存储了从左上角到任意点的元素值之和,以便于快速计算任意矩形区域的和。然后,通过遍历所有可能的矩形,利用累加数组快速计算每个矩形的元素值之和,并更新记录的最大和。

伪代码

1. 定义一个名为 `main` 的函数作为程序的入口点:
   - 读取两个整数 `n` 和 `r`,分别代表点的数量和矩形的边长。
   - 初始化两个大小为 `1002x1002` 的数组 `a` 和 `s`,`a` 用于存储输入的点的元素值,`s` 用于存储累加和。
   - 初始化变量 `ans` 为0,用于存储计算出的最大矩形和。

2. 循环 `n` 次,每次执行以下操作:
   - 读取三个整数 `x`、`y` 和 `w`,分别代表点的横纵坐标和元素值。
   - 将 `w` 存储到数组 `a` 的对应位置 `(x, y)`。

3. 构建累加数组 `s`:
   - 通过两层嵌套循环遍历数组 `a`,使用公式 `s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]` 来计算每个位置的累加和。

4. 计算最大矩形和:
   - 通过两层嵌套循环遍历数组 `s`,从 `(r, r)` 开始到 `1001`。
   - 对于每个位置 `(i, j)`,计算以 `(i, j)` 为右下角的矩形的元素值和,使用公式 `s[i][j] - s[i - r][i] - s[i][j - r] + s[i - r][j - r]`。
   - 使用 `max` 函数更新 `ans`,如果当前计算的矩形和大于 `ans`,则将当前值赋给 `ans`。

5. 打印出 `ans`,即最大矩形和。

6. 检查是否是直接运行该脚本,如果是,则调用 `main` 函数。

CODE


def main():
    n, r = map(int, input().split())
    a = [[0] * 1002 for _ in range(1002)]  # 创建1002x1002的数组
    s = [[0] * 1002 for _ in range(1002)]  # 创建1002x1002的累加数组
    ans = 0
    
    for _ in range(n):
        x, y, w = map(int, input().split())
        a[x][y] = w  # 赋值时不需要加1,因为Python索引从0开始
    
    # 构建累加数组s(最大的减去两个中间的加上最小的)
    for i in range(1, 1002):
        for j in range(1, 1002):
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]
    
    # 计算最大和
    for i in range(r, 1002):
        for j in range(r, 1002):
            ans = max(ans, s[i][j] - s[i - r][j] - s[i][j - r] + s[i - r][j - r])
    
    print(ans)

if __name__ == "__main__":
    main()

在这里插入图片描述

END

  • 18
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_千思_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值