题目
给定一个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()