一、题目
原题目链接:http://118.190.20.162/view.page?gpid=T3
二、解题
1.暴力求解,具体看代码。
2.读入数据
dev c++ 5.11
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int H[2010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>H[i];
}
H[n]=0;
long long MAX=0;
stack<int> s;
for(int i=0;i<=n;i++){
if(s.empty()||H[i]>=H[s.top()]){
s.push(i);
}else{
while(H[i]<H[s.top()]){
int temp=s.top();
s.pop();
if(!s.empty()){
MAX=max(MAX,(long long)H[temp]*(i-s.top()-1));
}else{
MAX=max(MAX,(long long)H[temp]*i);
break;
}
}
s.push(i);
}
}
cout<<MAX<<endl;
return 0;
}
3.提交结果
总结
1.代码思路
这是一个使用栈来查找直方图中最大面积的算法实现。
-
程序首先读取直方图中的柱数和它们的高度。然后创建一个含有n+1个元素的数组,其中最后一个元素为0。这是因为我们需要单独处理最后一根柱子,如果添加一个高度为零的额外柱子会更容易。
-
程序接着将最大面积的变量
MAX
初始化为零,然后创建一个空栈s
。 -
对于直方图中的每一根柱子
i
(包括高度为零的额外柱子),程序会检查栈s
是否为空,或者柱子的高度是否大于等于栈顶柱子的高度。如果是,程序就将i压入栈s
。 -
如果
H[i]
小于栈顶柱子的高度,程序就进入循环。它弹出栈顶元素temp
,并计算高度为H[temp]
,宽度为i-S.top()-1
的矩形面积。它会更新MAX
如果此面积大于MAX
。 -
当
H[i]
不再小于栈顶柱子的高度时,循环停止,程序将i
压入栈s
。 -
最后,程序输出
MAX
。该算法将使用栈来跟踪尚未处理的柱子的索引。当遇到高度小于栈顶柱子的柱子时,算法知道它无法再从栈顶柱子扩展最大面积。因此,它会计算对应于栈顶柱子的矩形面积,并在必要时更新
MAX
。然后,算法继续处理栈中的下一个柱子。
2.其他
(long long)H[temp]*(i-S.top()-1)
的解释
这段代码是为了计算H[temp]
作为矩形高度,i-S.top()-1
作为矩形宽度的矩形面积。
在计算过程中,S.top()
指的是在栈S中位于栈顶的元素的索引。因此,i-S.top()-1
表示在当前处理的柱子和栈顶柱子之间的距离,也就是矩形的宽度。
强制类型转换(long long)
用于确保计算的面积不会溢出int类型的范围,而是使用更大的long long类型。