问题描述:
小明的面前有一块长度为N
的正方形棋盘,共有N*N
个方格,在棋盘的每个格子上都放有一块硬币,要么正面朝上(以0
表示),要么背面朝上(以1
表示)。
小明可以任意选择一列,将列上的硬币翻转:正面朝上的硬币改为背面朝上,背面朝上的硬币改为反面朝上。
小明可以进行翻转操作无限次,他想要知道经过若干操作后,棋盘上最多有多少行上全是正面朝上的硬币。
输入:
# 第一行,只有一个正整数N表示 棋盘的长度(1<=N<=1000)
# 第二行到第 N+1行,每行有N个被空格隔开的 0 、1,表示硬币
输出:
# 只有一个数字,表示小明进行无限次翻转操作后,棋盘上最多有多少行上全是正面朝上的硬币。
问题分析:
问题比较有意思,我们可以倒着分析,经过若干翻转,要想得到全是正面朝上的行,那么可以肯定,这些行,之前最原始的状态,也是完全一样的,不用多解释。所以现在,只要求出,这个N*N
的棋盘上最原始的状态中,有那些行是完全一样的,统计出来,然后选择最大的,就是结果。
Python3实现:
# @Time :2018/10/22 下午 yitu 在线笔试题目
# @Author :LiuYinxing
class Solution:
def solve(self, N, matrix):
if N <= 1: return N
cnt = [1 for i in range(N)] # cnt[i] 表示和 matrix[i]行 相同的行数 (初始化为1,本身就是1个)
for i in range(1, N):
for j in range(i):
if matrix[i] == matrix[j]: # 开始统计
cnt[i] = max(cnt[i], cnt[j] + 1)
return max(cnt) # 选取最大的一个返回
if __name__ == '__main__':
solu = Solution()
N = 5
matrix = [[1, 0, 1, 0, 1],
[0, 1, 0, 1, 0],
[1, 0, 1, 0, 1],
[0, 1, 0, 1, 0],
[1, 0, 1, 0, 1]]
print(solu.solve(N, matrix))
声明: 总结学习,有问题或不妥之处,可以批评指正哦。