84.柱形图中最大的矩形
#include<stdio.h>
void answer1(int n, int list[]);
void answer2(int n, int list[]);
void answer3(int n, int list[], int left, int right);
int findMin(int left, int right, int list[]);
int Max;
int main()
{
int n;
scanf("%d", &n); //几个柱子
int list[n];
for(int i = 0; i < n; i ++)
scanf("%d", &list[i]);
answer1(n, list);
answer2(n, list);
answer3(n, list, 0, n-1);
printf("%d", Max);
}
void answer1(int n, int list[])
{
int max = 0;
for(int i = 0; i < n; i ++){
for(int j = i; j < n; j ++){
int min = list[i];
for(int k = i + 1; k <= j; k ++){
min = list[k] > min ? min : list[k];
}
max = min*(j - i + 1) > max ? min*(j - i + 1) : max;
}
}
printf("%d\n", max);
}
void answer2(int n, int list[])
{
int max = 0;
for(int i = 0; i < n; i ++){
int min = 99999;
for(int j = i; j < n; j ++){
min = min < list[j] ? min : list[j];
max = max > min * (j - i + 1) ? max : min * (j - i + 1);
}
}
printf("%d\n", max);
}
void answer3(int n, int list[], int left, int right)
{
if(left > right)
return ;
int min = findMin(left, right, list);
int max = (right - left + 1) * list[min];
if(max > Max)
Max = max;
if(left < min && min != 0)
answer3(n, list, left, min-1);
if(right > min && min != n)
answer3(n, list, min+1, right);
}
int findMin(int left, int right, int list[])
{
int min = left;
for(int i = left+1; i <= right; i ++){
if(list[i] < list[min])
min = i;
}
return min;
}
85.最大矩形
#include<stdio.h>
int a, b; //矩形的长和宽
void answer1(int matrix[a][b]);
int main()
{
scanf("%d %d", &a, &b);
int matrix[a][b];
for(int i = 0; i < a; i ++){
for(int j = 0; j < b; j ++)
scanf("%d", &matrix[i][j]);
}
answer1(matrix);
}
void answer1(int matrix[a][b])
{
int book[a][b];
int max = 0;
for(int i = 0; i < a; i ++){
for(int j = 0; j < b; j ++){
if(matrix[i][j] == 1){
if(j == 0)
book[i][j] = 1;
else
book[i][j] = book[i][j-1] + 1;
}
else
book[i][j] = 0;
int min = book[i][j];
for(int k = i; k >=0; k --){
int height = i - k + 1;
if(min > book[k][j])
min = book[k][j];
if(max < height*min)
max = height*min;
}
}
}
printf("%d", max);
}
6960

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



