最大空白区 题目描述: 小明有一张矩形彩纸,他将彩纸均匀的画了N*M个小方格,有些小方格中被他画了小草,有些小方格是空白的,现小明想找出一片空白的方格,并且这片空白方格是最大的矩形。 现给出N和M的值,及每个方格的状态,被画小草的小方格用数字1表示,空白小方格用数字0表示,请帮小明找出最大矩形,并输出最大矩形由多少个小方格组成。 例如:N=4,M=5, 输入描述: 第一行输入两个正整数N和M(2≤N≤100,2≤M≤100),分别表示矩形彩纸方格的行数和列数,两个正整数之间以一个空格隔开 第二行开始,输入N行,每行M个正整数(正整数为1或者0),1表示小草,0表示空白,正整数之间一个空格隔开 输出描述: 输出一个整数,表示最大矩形由多少个小方格组成 样例输入: 4 5 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 样例输出: 6

正确答案:最大空白(0)矩形。把0视为柱高连续累加、1清零,每行用单调栈求柱状图最大面积。核心:\nfor j in range(m):h[j]=h[j]+1 if r[j]==0 else 0\nst=[]\nfor i,x in enumerate(h+[0]):\n while st and h[st[-1]]>x:\n j=st.pop();w=i if not st else i-st[-1]-1;ans=max(ans,h[j]*w)\n st.append(i)
答案解析
评分标准:
4分:能正确输出第一组数据;
4分:能正确输出第二组数据;
4分:能正确输出第三组数据;
4分:能正确输出第四组数据;
4分:能正确输出第五组数据;
5分:能正确输出第六组数据。
试卷来源:202302(第14届)蓝桥杯C++编程青少组(选拔赛_中高级)真题