历年题解 CCF CSP历年题解(python)
样例输入:
6
3 1 6 5 2 3
题目链接:201312-3最大的矩形
问题分析:
从左到右遍历每个直方图,以该直方图为高,分别向左右找高度大于等于该直方图高的直方图,位置分别记录为l,r(l为负数,r为整数)
例如遍历到第四个直方图索引为3、高为5,向左6>5再1<5停止,记录l=-1即相对于原直方图左移一位,同理得r为0,即该次遍历以(索引3,高度5)得最大面积为10=(r-l+1)*5
满分例程:
#y总的思路
n=int(input())
s=list(map(int,input().split()))
area=[]
for i in range(n):
l,r=0,0#分别记录左右位置
#向左遍历直方图,找到能以s[i]为高的最大矩形,矩形长为r-l+1
for j in range(i-1,-1,-1):
if s[j]>=s[i]:
l-=1
else:
break
for j in range(i+1,n):
if s[j]>=s[i]:
r+=1
else:
break
area+=[s[i]*(r-l+1)]#长乘高
print(max(area))
编程量更少的思路:
遍历n个矩形,求其向右逐次扩展的面积,取最大值即为左边界为该矩形的最大矩形面积,例如第一个矩形,向右依次扩展得六个面积(3,2 ,3, 4, 5,6)
程序修改自该链接:CCF 201312-3 最大的矩形(Python100分)
链接程序虽满分,但因官网数据存在错误,未考虑矩形本身即为最大矩形的情况,例如输入
2
6 1
链接程序返回为2,实际最大矩形为6
修改过程序如下
n=int(input())
nums=list(map(int,input().split()))
total=0
for i in range(n):
h=nums[i]
area=nums[i]
for j in range(i+1,n):
if h>nums[j]:
h=nums[j]
area=max(area,h*(j-i+1))
total=max(total,area)
print(total)