3814 矩阵变换(思维题)

该博客讨论了一个关于01矩阵的问题,目标是通过变换找到最多全1行的数量。作者提出,由于行之间的相等关系,可以将行划分为等价类,并使用哈希表统计每种行的出现次数,从而找出最大出现次数的等价类。通过这段代码,实现了这一策略并返回了最大满足条件的行数。
摘要由CSDN通过智能技术生成

1. 问题描述:

给定一个 n × n 的 01 矩阵。你可以选择若干列(也可以不选),并将这些列上的所有元素进行变换(1 变 0,0 变 1)。你的目标是使得矩阵中有尽可能多的行满足:一行中的所有元素都为 1。输出可以得到的满足条件的行的最大数量。

输入格式

第一行包含整数 n。接下来 n 行,每行包含一个长度为 n 的 01 字符串,表示整个矩阵。

输出格式

输出可以得到的满足条件的行的最大数量。

数据范围

1 ≤ n ≤ 100

输入样例1:

4
0101
1000
1111
0101

输出样例1:

2

输入样例2:

3
111
111
111

输出样例2:

3
来源:https://www.acwing.com/problem/content/description/3817/

2. 思路分析:

分析题目可以知道如果两行元素相同那么他们的相等关系是一样的,所以对于矩阵中的所有行存在若干个等价类,我们只需要找到等价类中最大的出现次数即可,让其变为1即可。将每一行看成是一个字符串使用哈希表统计每一行出现的次数,找到最大的出现次数即可。

3. 代码如下:

class Solution:
    def process(self):
        n = int(input())
        g = list()
        mp = dict()
        for i in range(n):
            s = input()
            if s not in mp: mp[s] = 1
            else: mp[s] += 1
        res = 0
        for k, v in mp.items():
            res = max(res, v)
        return res


if __name__ == '__main__':
    print(Solution().process())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值