算法题 - 翻转硬币 - Python

问题描述:

翻转硬币

小明的面前有一块长度为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))

声明: 总结学习,有问题或不妥之处,可以批评指正哦。

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/83511830