问题描述
| 试题编号: | 201312-3 |
| 试题名称: | 最大的矩形 |
| 时间限制: | 1.0s |
| 内存限制: | 256.0MB |
| 问题描述: |
问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
输入格式 第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。 输出格式 输出一行,包含一个整数,即给定直方图内的最大矩形的面积。 样例输入 6 样例输出 10 |
解题思路:
1. 从第一个块开始,逐渐加入块,如果加入后值大于当前最大值,则更新最大值,直到无块可加;
2. 然后从第二个块开始加入,逐渐加入块,如果加入后值大于当前最大值,则更新最大值,直到无块可加;
3. 一直循环,全部循环之后的当前最大值,即为全局最大值。
代码:
#include <stdio.h>
#include <string.h>
void doit(char sign[],char (*ch)[101],int n,int flag);
void pipeiwithout(char sign[],char ch[]);
void pipei(char sign[],char ch[]);
int main() {
char sign[101],ch[100][101];
int i,flag,n;
gets(sign);
scanf("%d%d",&flag,&n);
getchar();
for(i=0;i<n;i++)
gets(ch[i]);
doit(sign,ch,n,flag);
return 0;
}
void doit(char sign[],char (*ch)[101],int n,int flag){
int l=strlen(sign);
int i,j;
if(flag==1){
for (i = 0;i< n;++i) {
pipei(sign,ch[i]);
}
}
else{
for (i = 0; i< n; ++i) {
pipeiwithout(sign,ch[i]);
}
}
}
void pipei(char sign[],char ch[]){
int f=0,i,j,ls=strlen(sign),lc=strlen(ch);
for(i=0;i<lc-ls+1;i++){
f=0;
for(j=0;j<ls;j++){
if(sign[j]==ch[i+j]){
f++;
} else{
break;
}
}
if(f==ls)
break;
}
if(f==ls){
puts(ch);
}
}
void pipeiwithout(char sign[],char ch[]){
int f=0,i,j,ls=strlen(sign),lc=strlen(ch);
for(i=0;i<lc-ls+1;i++){
f=0;
for(j=0;j<ls;j++){
if((sign[j]==(ch[i+j]-('a'-'A')))||(sign[j]==(ch[i+j]-('A'-'a')))||sign[j]==ch[i+j]){
f++;
} else{
break;
}
}
if(f==ls)
break;
}
if(f==ls){
puts(ch);
}
}
个人小结:
本代码得分100,即通过全部测试数据,如对代码有疑问,欢迎留言一起探讨。

本文详细解析了一种寻找直方图中最大矩形面积的算法。通过逐步加入矩形块并更新最大值的方式,实现了对给定直方图内最大矩形面积的有效计算。


1114

被折叠的 条评论
为什么被折叠?



