某知名企业的笔试上机题,第一次做这种上机笔试,很是生疏,据说有点类似ACM,主要是全英文内容,读懂题目都要花一定时间。大概的题意是:
- 给定一个N*M的矩阵,3≧N≧100,3≧M≧20,值为0,1随机分布。
- 给定一个K,1≧K≧M。
- 翻转矩阵的列K次,即某一列的所有值0转1,1转0,必须用满K次。
- 如何翻转可以得到矩阵中行全为1的最大行数,输出这个最大值。
平时做算法题做的真的少呀,不过这题读懂后,感觉不难,知道要用DFS,枚举每一种翻转,比较各自的结果,返回最大值即可,然而最后不知道为啥死循环了,难受。第二天,花了一点时间又把思路捋了一下:
- 矩阵有M列,设一片森林有M颗满M叉树,每棵树有K层。每个节点的位置设为第k层,第m个,其值为矩阵的第k次翻转中,翻转第m列后的结果。
- 深度搜索每棵树,到达底端,由叶子结点开始,比较同一根节点下的子树最大值作为根节点的值返回继续比较,直至最后比较M棵树的根节点的值,返回最大值作为结果。
这个应该是比较简单的方法,时间复杂度O(M^K),应该吧,代码放在下面,后续有问题再改,如果有时间的话。。。
import java.util.Scanner;
public class Main {
private static int count = 0;
public static void main(