测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A38871. (注.input()输入函数的括号中不允许添加任何信息)

填空题 困难

题目描述

题目描述

(注.input()输入函数的括号中不允许添加任何信息)

时间限制:3000MS 内存限制:589824KB

编程实现

小明有一张N*M的方格纸,且部分小方格中涂了颜色,部分小方格还是空白。

给出N(2≤N≤30)和M(2≤M≤30)的值,及每个小方格的状态(被涂了颜色小方格用数字1表示,空白小方格用数字0表示),请帮助小明找出最大的矩形空白区域,并输出该矩形空白区域由多少个小方格组成。

例如:N=4,M=5,4*5的方格纸中每个小方格的状态如下图:

最大的空白区域由6个小方格组成(红色框区域)。

输入描述

第一行输入两个正整数N和M(2≤N≤30,2≤M≤30),分别表示方格纸的行数和列数,两个正整数之间以一个空格隔开

第二行开始输入N行,每行M个整数(整数为1或者0),1表示涂色方格,0表示空白方格,整数之间以一个空格隔开

输出描述

输出一个整数,表示最大矩形由多少个小方格组成(如果没有空白小方格,输出0)

样例输入

4 5

1 1 0 0 0

1 0 1 0 0

0 0 0 1 1

0 0 0 1 0

样例输出

6

参考答案

class stack(object): # 栈 def __init__(self): self.__list = [] def is_empty(self): return self.__list == [] def push(self, item): self.__list.append(item) def pop(self): self.__list.pop() def top(self): if self.__list: return self.__list[-1] else: return None def size(self): return len(self.__list) def Max_s(lis): st=stack() max_=0 for i in range(len(lis)): if st.is_empty() or lis[i]>lis[st.top()]: st.push(i) else: while st.is_empty()==False and lis[i]<lis[st.top()]: h=lis[st.top()] st.pop() if st.is_empty(): w= i else : w = i - 1 - st.top() max_=max(max_,h*w) st.push(i) while st.is_empty()==False : h=lis[st.top()] st.pop() if st.is_empty(): w= i else : w = i - 1 - st.top() max_=max(max_,h*w) return max_ n,m=map(int,input().split()) ls=[] for i in range(n): ls.append(list(map(int,input().split()))) max_n=0 lst=[0]*m for i in range(n): for j in range(m): if ls[i][j]==0 : lst[j] +=1 else : lst[j]=0 max_n=max(max_n,Max_s(lst)) print(max_n)
上一题 下一题