首页 > 试题广场 >

小美的平衡矩阵

[编程题]小美的平衡矩阵
  • 热度指数:2138 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小美拿到了一个n*n的矩阵,其中每个元素是 0 或者 1。
小美认为一个矩形区域是完美的,当且仅当该区域内 0 的数量恰好等于 1 的数量。
现在,小美希望你回答有多少个i*i的完美矩形区域。你需要回答1\leq i \leq n的所有答案。

输入描述:
第一行输入一个正整数n,代表矩阵大小。
接下来的n行,每行输入一个长度为n的 01 串,用来表示矩阵。
1\leq n \leq 200


输出描述:
输出n行,第i行输出i*i的完美矩形区域的数量。
示例1

输入

4
1010
0101
1100
0011

输出

0
7
0
1
def count_perfect_matrices(matrix, n):
    prefix_diff = [[0] * (n + 1) for _ in range(n + 1)]

    for i in range(1, n + 1):
        for j in range(1, n + 1):
            current_val = 1 if matrix[i - 1][j - 1] == '1' else -1
            prefix_diff[i][j] = (prefix_diff[i - 1][j] + prefix_diff[i][j - 1] - 
                                 prefix_diff[i - 1][j - 1] + current_val)

    results = []
    for size in range(1, n + 1):
        perfect_count = 0
        for i in range(size, n + 1):
            for j in range(size, n + 1):
                total_diff = (prefix_diff[i][j] - prefix_diff[i - size][j] -
                              prefix_diff[i][j - size] + prefix_diff[i - size][j - size])
                if total_diff == 0:
                    perfect_count += 1
        results.append(perfect_count)
    
    return results

n = int(input().strip())
matrix = [input().strip() for _ in range(n)]

result = count_perfect_matrices(matrix, n)
for count in result:
    print(count)
将0处理为-1,直接前缀和计算
编辑于 2024-04-30 17:33:17 回复(0)