首页 > 试题广场 >

求最大子矩阵的大小

[编程题]求最大子矩阵的大小
  • 热度指数:4075 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个整型矩阵 map,其中的值只有 0 和 1 两种,求其中全是 1 的所有矩形区域中,最大的矩形区域里 1 的数量。

输入描述:
第一行输入两个整数 n 和 m,代表 n*m 的矩阵
接下来输入一个 n*m 的矩阵


输出描述:
输出其中全是 1 的所有矩形区域中,最大的矩形区域里 1 的数量。
示例1

输入

1 4
1 1 1 0

输出

3

说明

最大的矩形区域有3个1,所以返回3

备注:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))

typedef struct
{
    int *data;
    int top;
} stack;

void init_stack(stack *stp, int *arr);
void push(stack *stp, int val);
int pop(stack *stp);
int peek(stack *stp);
bool is_empty(stack *stp);

int max_area(const int *height, int n)
{
    int i, j, curArea, maxArea = 0, *data;
    stack st = {0}, *stp = &st;
    data = (int *) malloc(n * sizeof(int));
    init_stack(stp, data);
    for (i = 0; i < n; i++)
    {
        while (!is_empty(stp) && height[i] < height[peek(stp)])
        {
            j = pop(stp);
            curArea = height[j] * (i - (is_empty(stp) ? -1 : peek(stp)) - 1);
            maxArea = MAX(maxArea, curArea);
        }
        push(stp, i);
    }
    while (!is_empty(stp))
    {
        j = pop(stp);
        curArea = height[j] * (n - (is_empty(stp) ? -1 : peek(stp)) - 1);
        maxArea = MAX(maxArea, curArea);
    }
    free(data);
    return maxArea;
}

int main(void)
{
    int n, m, *height, i, j, tmp, res = 0;
    scanf("%d%d", &n, &m);
    height = (int *) calloc(m, sizeof(int));
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &tmp);
            height[j] = tmp == 0 ? 0 : (height[j] + 1);
        }
        tmp = max_area(height, m);
        res = MAX(res, tmp);
    }
    printf("%d\n", res);
    free(height);
    return 0;
}

void init_stack(stack *stp, int *arr)
{
    stp->data = arr;
    stp->top = -1;
}

void push(stack *stp, int val)
{
    stp->data[++stp->top] = val;
}

int pop(stack *stp)
{
    return stp->data[stp->top--];
}

int peek(stack *stp)
{
    return stp->data[stp->top];
}

bool is_empty(stack *stp)
{
    return stp->top == -1;
}



发表于 2022-07-24 23:45:33 回复(0)

问题信息

上传者:小小
难度:
1条回答 4214浏览

热门推荐

通过挑战的用户

查看代码