首页 > 其他分享 >POJ 3494 Largest Submatrix of All 1’s(单调栈)

POJ 3494 Largest Submatrix of All 1’s(单调栈)

时间:2022-10-05 22:34:44浏览次数:73  
标签:idx int 矩阵 3494 Submatrix stk POJ Largest

POJ 3494 Largest Submatrix of All 1’s(单调栈)

题意:

​ 给出一个01矩阵,请找出其中最大的全部为1构成的子矩阵。矩阵大小为\(2000 * 2000\)

思路:

​ 我们把问题分解到每一行,对于第j列,我们可以维护其左边第一个高度低于\(h_j\)的下标,同理维护左边第一个高度低于\(h_j\)的下标。那么这就是子矩阵的宽度,高度为\(h_j\)。我们可以发现这是一个用单调栈维护的过程。那么我们就可以用\(O(n^2)\)的做法来完成这一题了。

实现:

要注意边界,如果栈空的时候,就意味着可以取满(也就是最边界。

const int N = 2005;
int n, m;
int stk[N], idx;
int h[N]; 
int l[N], r[N];

int main()
{
	while(~scanf("%d%d", &n, &m))
	{
		int res = 0;
		for(int i = 1; i <= m; i ++)	h[i] = 0;
		for(int i = 1; i <= n; i ++)
		{
			for(int j = 1; j <= m; j ++)
			{
				int x; scanf("%d", &x);
				h[j] = x ? h[j] + 1 : 0;
			}

			idx = 0;
			for(int j = 1; j <= m; j ++) //左边第一个小于h_j的
			{
				while(idx >= 1 && h[stk[idx]] >= h[j])	idx --;
                                if(idx >= 1)
                                    l[j] = stk[idx];
                                else
                                    l[j] = 0;
				stk[++ idx] = j;
			}

			idx = 0;
			for(int j = m; j >= 1; j --) //右边第一个小于h_j的
			{
				while(idx >= 1 && h[stk[idx]] >= h[j])	idx --;
                                if(idx >= 1)
			            r[j] = stk[idx];
                                else
                                    r[j] = m + 1;
				stk[++ idx] = j;
			}

			// cout << l[i] << ' ' << r[i] << '\n'; 
			for(int j = 1; j <= m; j ++)
				res = max(res, h[j] * ((r[j] - 1) - (l[j] + 1) + 1));
		}
		printf("%d\n", res);
	}
}	

标签:idx,int,矩阵,3494,Submatrix,stk,POJ,Largest
From: https://www.cnblogs.com/DM11/p/16756614.html

相关文章

  • POJ 2227 The Wedding Juicer(三维接雨水 BFS 贪心
    POJ2227TheWeddingJuicer(三维接雨水BFS贪心)题意:​ 给出一个二维地图,其各点上权值为其高度。如果向其中填水,请问在这张地图中可以积得多少水。​ 地图长宽为300,高......
  • POJ 3697 USTC campus network(BFS 删边)
    POJ3697USTCcampusnetwork(BFS删边)题意:​ 有一张图,每个点\(n\le10000\)之间都有一条边。现在删去若干条边\(m\le1000000\),请问还有多少点是联通的。思路:​ 我......
  • POJ - 2348 Euclid's Game
    Euclid'sGame博弈很经典的博弈了首先明确每个状态必然都对应着一个局面,先手必败\(or\)先手必胜如果当前局面对于先手来说是能够选择的,也就是\(b>=a*2\),对于一......
  • SPOJ GSS 系列杀青
    算是题单吧太壮观了兄弟们,可是之前\(8\)题难度评分都高一档的啊。GSS1区间最大子段和板子题,用线段树随便过。GSS2相同的数只算一次,我们离线询问,顺序插入数组中的值......
  • POJ 2348 Euclid's Game(博弈论 辗转相减)
    POJ2348Euclid'sGame(博弈论辗转相减)题目:​ 给出两个数,A,B轮流操作。每次操作可以将大的数减去小的数的整数倍,若操作后出现0,执行这次操作的人胜。思路:​ 根据样例(25......
  • POJ 1064 Cable master(浮点数二分 精度处理)
    POJ1064Cablemaster(浮点数二分精度处理)题目:​ 给出n棵木头,现在要求将木头裁成k个长度相同的小木头,请问这k个小木头的最大长度是多少。裁出来后不支持拼接。所有长度......
  • POJ 2247 Humble Numbers(搜索,生成子集)
    HumbleNumbers(搜索,生成子集)题目:​ 给出多次询问,问第k个丑数是多少(最多询问到k=5842)。​ 丑数:分解质因数后,质因子只包含2,3,5,7的数字。思路:​ 通过预处理得到,584......
  • 关于Axios传json对象给后端,后端将json在转换为pojo对象,
    Controller使用@ResquestParam注解,形参并不直接写pojo对象,而是Map<String,Object>对象,然后使用其get(“key”)方法得到前端作为url参数传递过来的json格式的object对象,使用......
  • POJ 2110 Mountain Walking(二分 枚举 BFS)
    POJ2110MountainWalking(二分枚举BFS)题目:​ 给出一张\(n*n(n\le100)\)的地图,每个点都有一个点权\((val\le110)\),可以任意选择路径,请问从(1,1)走到(n,n)的路......
  • POJ3071 Football
    POJ3071Football翻译岛田小雅题目描述\(2^n\)个队伍参加一场单淘汰制足球锦标赛,它们被编号为\(1,2,…,2^n\)。每一轮比赛,未被淘汰的队伍按照升序被放在一个列表里,接......