给定一个二维网格 grid,其大小为 m x n。 需要统计满足以下条件的子矩形的数量: 子矩形的大小为 side x side。 子矩形中所有元素的总和不小于 min_power。 解决方案
直接枚举: 遍历所有可能的子矩形的左上角位置 (i, j)。 计算以 (i, j) 为左上角,大小为 side x side 的矩形的元素总和。 如果总和大于或等于 min_power,则计数器 count 加 1。 优化计算: 枚举过程中,重复计算子矩形内的元素总和会导致效率低下。 使用 行前缀和 优化: 先计算每一行中长度为 side 的连续子数组的和。 再通过这些行前缀和计算矩形总和。
算法流程
初始化一个二维数组 row_sum,其中 row_sum[i][j] 表示网格中第 i 行从列 j 开始,长度为 side 的连续子数组的和。 遍历所有可能的子矩形左上角位置 (i, j): 使用 row_sum 快速计算该矩形的总和。 如果总和大于或等于 min_power,计数器加 1。 输出计数器的值。
# 输入获取
m, n, side, min_power =map(int,input().split())# 输入矩阵大小、子矩形边长和最小能量值
grid =[list(map(int,input().split()))for _ inrange(m)]# 输入网格矩阵defcount_valid_zones():# 初始化计数器
count =0# 计算每一行中宽度为 side 的连续子数组的前缀和
row_sum =[[0]* n for _ inrange(m)]# 用于存储行前缀和的二维数组for i inrange(m):for j inrange(n - side +1):# 仅计算宽度为 side 的部分
row_sum[i][j]=sum(grid[i][j:j + side])# 计算每行的子数组和# 遍历所有可能的矩形左上角位置 (i, j)for i inrange(m - side +1):for j inrange(n - side +1):# 计算以 (i, j) 为左上角的 side x side 矩形的总和
total =sum(row_sum[x][j]for x inrange(i, i + side))# 如果总和大于等于 min_power,则计数器加 1if total >= min_power:
count +=1return count
# 输出满足条件的矩形数量print(count_valid_zones())
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
java解法
解题思路
问题描述
给定一个二维网格 grid(大小为 rows x cols),需要统计满足以下条件的子矩形的数量: 子矩形的大小为 size x size。 子矩形内的所有元素总和不小于 minSum。 解决方案
评论记录:
回复评论: