51nod 1158 全是1的最大子矩阵

题目链接:51nod 1158 全是1的最大子矩阵

题目分类是单调栈,但是直接用与解最大子矩阵类似的办法水过了。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define CLR(a,b) memset((a),(b),sizeof((a)))
 6 using namespace std;
 7 const int N = 501;
 8 const int inf = 0x3f3f3f3f;
 9 int n, m;
10 int dp[N][N];
11 int main(){
12     int i, j, k, ans, x, h;
13     scanf("%d%d", &m, &n);
14     CLR(dp, 0);
15     for(i = 1; i <= n; ++i){
16         for(j = 1; j <= m; ++j){
17             scanf("%d", &x);
18             if(x) dp[i][j] = x + dp[i-1][j];
19         }
20     }
21     ans = 0;
22     for(i = 1; i <= m; ++i){
23         for(j = 1 ; j <= n; ++j){
24             h = inf;
25             for(k = i; k <= m; ++k){
26                 h = min(h, dp[j][k]);
27                 if(h == 0) break;
28                 ans = max(ans, (k-i+1) * h);
29             }
30         }
31     }
32     printf("%d\n", ans);
33     return 0;
34 }

时间: 2024-08-07 00:18:37

51nod 1158 全是1的最大子矩阵的相关文章

HDU -1506 Largest Rectangle in a Histogram&amp;&amp;51nod 1158 全是1的最大子矩阵 (单调栈)

单调栈和队列讲解:传送门 HDU -1506题意: 就是给你一些矩形的高度,让你统计由这些矩形构成的那个矩形面积最大 如上图所示,如果题目给出的全部是递增的,那么就可以用贪心来解决 从左向右依次让每一个矩形的高度当作最后的高度,来从中选取最大值就可以了 但是如果它不是递增的,中间会出现低谷,那么要还想运用贪心策略就要把之前高度大于它的全部扔掉,但是再扔掉他们之前还要判断一下以他们为最后答案的高度可不可行,这样我们就是在构造一个递增序列,可以用栈来维护它 代码: 1 #include<stdio.

51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))

前置问题:51nod 1102 面积最大的矩形 附上链接: 51nod 1102 面积最大的矩形 这题的题解博客 需要了解的知识:单调栈,在前置问题中已经讲解. 解题思路 对每行求左边连续1的个数,得到数组a[i][j]; 对于第j列,找出每个位置i的数字a[i][j]上面第一个比它小数字l,和下面第一个比它小的数字r. 由这个点所在列为底,这个点的数字为最小值产生的矩形的面积为a[i][j]*(r-l-1),用这一列每一个面积更新ans. 上面2的求法就是单调栈了,总时间复杂度o(n*m).

1158 全是1的最大子矩阵

1158 全是1的最大子矩阵 基准时间限制:1 秒 空间限制:131072 KB 给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的.输出M2的面积. Input 第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500) 第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1. Output 输出最大全是1的子矩阵的面积. Input示例 3 3 1 1 0 1 1 1 0 1 1 Output示例 4思路:

51nod1158 全是1的最大子矩阵

跟最大子矩阵差不多O(n3)扫一下.有更优写法?挖坑! #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) int read(){ int x=0;ch

统计全为 1 的正方形子矩阵 统计正方形的个数

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix =[  [0,1,1,1],  [1,1,1,1],  [0,1,1,1]]输出:15解释: 边长为 1 的正方形有 10 个.边长为 2 的正方形有 4 个.边长为 3 的正方形有 1 个.正方形的总数 = 10 + 4 + 1 = 15.示例 2: 输入:matrix = [ [1,0,1], [1,1,0], [1,1,0]]输出:7解

最大全0/1子矩阵

我们常常会遇到这样的问题:给定一个01矩阵,求其中全0/1的最大子矩阵的面积. 简单的模板题如:[Luogu]P4147,复杂点的有[Luogu]P5300 下面我们介绍一种比较容易的算法:悬线法 其实悬线法更多的是一种思想,许多最大化子矩阵的问题也能用这种思想解决. 我们想象有一条竖线,这条线的上端要么是边界,要么是障碍点,然后我们让这条线向左右拓展,直到碰到边界和障碍点. 求出一个位置的悬线后,我们就能直接计算$S = H(R - L + 1)$.然后对所有的$S$取$max$即为答案,正确

bzoj1127[POI2008]KUP 悬线法

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 485  Solved: 174[Submit][Status][Discuss] Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左上和右下的列-行坐标或NIE Sample Input inputdata1 4 3 1

Leetcode周赛165

目录 找出井字棋的获胜者 思路 代码 不浪费原料的汉堡制作方案 思路 代码 统计全为 1 的正方形子矩阵 思路 代码 分割回文串 III 思路 代码 找出井字棋的获胜者 思路 模拟. 代码 class Solution { public: char mp[4][4]; bool check(int x, int y, char ch) { int flag = 1; for(int i = 0; i < 3; ++i) { if(mp[x][i] != ch) flag = 0; } if(fl

LeetCode 第 165 场周赛

LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能说数据不充分 找出井字棋的获胜者4 题目描述 Description A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "