Java实现矩阵列翻转,获取行全为1的最大行数

这是一道某知名企业笔试中的上机题,要求在给定的N*M矩阵中,通过K次列翻转使行全为1的行数达到最大。题目解析及解题思路涉及深度优先搜索(DFS)算法,通过构建森林和树状结构来模拟翻转过程,以O(M^K)的时间复杂度找到最优解。虽然初次尝试出现死循环,但经过梳理,给出了正确的解决方案。
摘要由CSDN通过智能技术生成

某知名企业的笔试上机题,第一次做这种上机笔试,很是生疏,据说有点类似ACM,主要是全英文内容,读懂题目都要花一定时间。大概的题意是:

  1. 给定一个N*M的矩阵,3≧N≧100,3≧M≧20,值为0,1随机分布。
  2. 给定一个K,1≧K≧M。
  3. 翻转矩阵的列K次,即某一列的所有值0转1,1转0,必须用满K次。
  4. 如何翻转可以得到矩阵中行全为1的最大行数,输出这个最大值。

平时做算法题做的真的少呀,不过这题读懂后,感觉不难,知道要用DFS,枚举每一种翻转,比较各自的结果,返回最大值即可,然而最后不知道为啥死循环了,难受。第二天,花了一点时间又把思路捋了一下:

  1. 矩阵有M列,设一片森林有M颗满M叉树,每棵树有K层。每个节点的位置设为第k层,第m个,其值为矩阵的第k次翻转中,翻转第m列后的结果。
  2. 深度搜索每棵树,到达底端,由叶子结点开始,比较同一根节点下的子树最大值作为根节点的值返回继续比较,直至最后比较M棵树的根节点的值,返回最大值作为结果。

这个应该是比较简单的方法,时间复杂度O(M^K),应该吧,代码放在下面,后续有问题再改,如果有时间的话。。。

import java.util.Scanner;

public class Main {

    private static int count = 0;

    public static void main(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值