H - Maximal submatrix HDU - 6957

H - Maximal submatrix HDU - 6957

题意:

给定一个n行m列的矩阵,求每列上面积不减的最大子矩阵

对于每个测试用例,打印一个表示最大子矩阵的整数

题解:

要求求一个最大面积的满足每列非递减的矩阵,这怎么想?
我们可以转化成01矩阵,每一个位置1表示该位置比上面一位大,然后求最大的01矩阵就可以了,单调栈做法时注意0的话可以作为矩阵的开始,详细看看代码

代码:

单调栈做法

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;
//Fe~Jozky
const ll INF=0x3f3f3f3f;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int n,m;
const int maxn=2e3+9;
int a[maxn][maxn];
int h[maxn][maxn];
int w[maxn][maxn]; 
int st[maxn],top;
int ans=0;
void precal(){memset(w,0,sizeof(w));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(h[i][j]==0)w[i][j]=1;else w[i][j]=w[i-1][j]+1;}w[i][m+1]=-1; }
}
void cal(){for(int i=1;i<=n;i++){top==0;for(int j=1;j<=m+1;j++){if(top==0||w[i][j]>=w[i][st[top]]){st[++top]=j;}else {int id;while(top!=0&&w[i][j]<w[i][st[top]]){id=st[top];top--;ans=max(ans,(j-id)*w[i][id]);}st[++top]=id;w[i][id]=w[i][j];}}}
}
void solve(){n=read();m=read();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){a[i][j]=read();}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]>=a[i-1][j])h[i][j]=1;else h[i][j]=0;}}precal();cal(); cout<<ans<<endl;
}
int main()
{#ifdef ONLINE_JUDGE#elsefreopen("1.in","r",stdin);#endifint t;t=read();while(t--){ans=0;solve();}fclose(stdin);return 0;
}

纵向的悬线法

#include <iostream>
#include <cstring>
#define FAST ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define endl '\n'
#define debug(x) cout << #x << " = " << (x) << endl
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)using namespace std;const int maxn = 2e3+5;int n, m;
short a[maxn][maxn];
bool b[maxn][maxn];
short up[maxn][maxn], down[maxn][maxn], len[maxn][maxn];void tran() {mem(b, 0);rep(i, 1, n) {rep(j, 1, m) {if (i == 1) continue;else if (a[i][j] >= a[i-1][j]) b[i][j] = 1;}}
}void init() {rep(i, 1, n) {rep(j, 1, m) {up[i][j] = i;down[i][j] = i;len[i][j] = 1;}}
}int main()
{FAST;int t; cin >> t;while (t--) {cin >> n >> m;rep(i, 1, n) {rep(j, 1, m) {cin >> a[i][j];}}tran();init();rep(j, 1, m) {rep(i, 2, n) {if (b[i][j]) up[i][j] = up[i-1][j];}per(i, n-1, 1) {if (b[i+1][j]) down[i][j] = down[i+1][j];}}int ans = m;rep(j, 1, m) {rep(i, 1, n) {if (b[i][j-1]) {len[i][j] = len[i][j-1] + 1;up[i][j] = max(up[i][j], up[i][j-1]);down[i][j] = min(down[i][j], down[i][j-1]);}int llen = down[i][j] - up[i][j] + 1;ans = max(ans, llen * len[i][j]);}}cout << ans << endl;}return 0;
}

另一种悬线法

写法就是:对于每一行的最大范围就是两侧0之间,我们设高度一开始为0,是因为每一个矩阵第一行是可以有0的,但是之后不可以,所以我们最后得到的高度还要算上第一行。相当于我们刨去第一行考虑01矩阵,最后再算上第一行
比如:01矩阵:

01011
01110
11111

我们先不考虑第一行,然后考虑后两行的左右宽度和高,左=2,右为4,高为2,那么答案就是(4-2+1)*(2+1)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
int t,n,m;
int l[maxn][maxn];
int le[maxn][maxn];
int r[maxn][maxn];
int h[maxn][maxn];
int main()
{cin>>t;while(t--){cin>>n>>m;memset(le,0,sizeof(le));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){le[0][j]=0;scanf("%d",&l[i][j]);if(i!=1)if(l[i][j]>=l[i-1][j]){le[i][j]=1;}//else le[i][j]=1;}}memset(l,0,sizeof(l));memset(h,0,sizeof(h));memset(r,0,sizeof(r));int ans=m;int L=1e9,R=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(le[i][j]==1){L=min (L,j);}else L=1e9;l[i][j]=L;//如果当前点为0,左端点取正无穷 }for(int j=m;j>=1;j--){if(le[i][j]==1){R=max(R,j);}else R=0;r[i][j]=R;//如果当前端点为0,右端点取无穷小 }for(int j=1;j<=m;j++){if(le[i-1][j]==1){h[i][j]=h[i-1][j]+1;l[i][j]=max(l[i-1][j],l[i][j]);r[i][j]=min(r[i-1][j],r[i][j]);}else h[i][j]=1;if(le[i][j]==1){ans=max(ans,(r[i][j]-l[i][j]+1)*(h[i][j]+1));}}} cout<<ans<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NewLife.XCode]实体类详解

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

CF662C Binary Table(FWT_XOR卷积)

problem 洛谷链接 solution 第二次做的时候发现自己还是不会。发现自己没有写过题解&#xff0c;看来当时是没有完全搞懂的。 nnn 与 mmm 的量级相差很大&#xff0c;nnn 的范围是完全可以状压的。 不妨考虑枚举最后翻转了哪些行&#xff0c;将操作状压为一个数 XXX。 显然…

AT5662 [AGC040D] Balance Beam(二分)

前言 人类智慧&#xff0c;不可思议。 解析 考虑画出两个人的 S−TS-TS−T 折线图&#xff0c;那么答案如何表示&#xff1f; 可以理解成把 BBB 的图像不断下移&#xff0c;直到与 AAA 的图像只剩一个交点&#xff0c;此时在 xxx 轴的截矩就是答案。 设平移后 BBB 图像与 x…

Counting Triangles

Counting Triangles 题意&#xff1a; 给你一个完全图&#xff0c;每个边被赋值为0或1&#xff0c;问这个完全图中有多少个完美三角形&#xff1f; 完美三角形定义&#xff1a;三角形的三边都为0或1 题解&#xff1a; 正着求不好求&#xff0c;我们可以倒着想 不考虑完美&a…

程序员过关斩将--论商品促销代码的优雅性

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;YY说你帮她解决了几个问题&#xff0c;也帮我解决一个呗原来是D妹子&#xff0c;来坐我身边&#xff0c;说下情况我的项目是个电商项目&#xff0c;现在产品狗要给商品做活动正常呀我一个新手初来咋到顶不住压力了&…

[WC2018]州区划分(FWT_OR卷积)

problem 洛谷链接 solution 显然题目指向&#xff1a;存在欧拉回路的州划分是不合法的。 当且仅当这个州是 联通 的且 内部没有奇数度数的点 时&#xff0c;这个州不合法。 因为 nnn 非常小&#xff0c;我们可以枚举每一种州划分方案&#xff0c;判断是否合法&#xff0c;…

P5469 [NOI2019] 机器人(拉格朗日插值、区间dp)

解析 打表可得&#xff0c;有效状态大概只有 O(m)O(nlog⁡n)O(m)O(n\log n)O(m)O(nlogn) 种。 枚举最靠右的最大值位置&#xff0c;不难得到 O(mV)O(mV)O(mV) 的做法。 期望得分 505050 分。 考虑如何做 l0,r109l0,r10^9l0,r109。&#xff0c;发现前缀和后所有的 dpi,i,xxdp_…

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…

[NewLife.XCode]增删改查入门

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

P5472 [NOI2019] 斗主地(期望、数学)

前言 我咋连表都没打啊。 too vegetable。 解析 题目给出的洗牌形式看着并不好看&#xff0c;合理猜测可以发现&#xff0c;这其实就等价于所有可能情况等概率出现。 然后就不会了 打表可以发现&#xff1a;当 tp1 时&#xff0c;dp 数组是一个等差数列。当 tp2 时&#xff…

[HNOI2012]集合选数(思维构造 + 状压dp)

problem 题目链接 solution 从最小一个数 xxx 开始&#xff0c;将其 2x,3x2x,3x2x,3x 放入&#xff0c;再将 2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x),3(3x) 放入&#xff0c;以此类推 …\dots… 将其合并为一个集合。重复又找一个最小未进入集合的…

在实际项目中使用LiteDB NoSQL数据库

LiteDB 是一个 NoSQL 数据库&#xff0c;特点是 MongoDB like 和 0 配置。100% 原汁原味的 C# 开发, Release 只有一个 DLL&#xff0c;官方有一下适用场景&#xff1a;移动App&#xff0c;桌面小应用程序&#xff0c;特有的文件格式&#xff0c;小型的 Web 应用&#xff0c;需…

2021牛客暑期多校训练营3

2021牛客暑期多校训练营3 题号题目知识点AGuess and liesBBlack and whiteCMinimum grid二分图匹配DCountEMath数论打表找规律F24dian模拟GYu Ling(Ling YueZheng) and Colorful TreeHLing Qiu, Luna and Triple BackpackIKuriyama Mirai and Exclusive OrJCounting Triangles…

P4769 [NOI2018] 冒泡排序(组合数学)

前言 这里是线性做法。 在题解里几句话说清楚的性质愣是推了一上午。 too vegetable 解析 考虑怎样的排列是不合法的。 一个排列如果不合法&#xff0c;也就是在某次交换时其中一个元素距离目标的距离没有减少反而增大了&#xff0c;那么以后这个数一定会再换回来&#xff0…

[骗分技巧——随机化Ⅰ]CodeChef-Milestones,CF364D-Ghd

文章目录CodeChef-MilestonesproblemsolutioncodeCF364D-Ghdproblemsolutioncode设随机化一次的正确率为 ppp&#xff0c;一次的复杂度为 O(f(n))O(f(n))O(f(n))。则随机的期望次数 kkk&#xff1a;k∑i1∞p(1−p)i−1i(1)(1−p)k∑i1∞p(1−p)ii∑i2∞p(1−p)i−1(i−1)(2)(1)…

初探奥尔良(Orleans)

由于工作上关系目前经常被各种并发数据问题搞得焦头烂额&#xff0c;要么要性能舍弃数据上得一致性&#xff0c;要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗&#xff1f;然后找到了类似奥尔良这种基于Actor模型的kuangjia首先本人因为是C#系的所以暂不…

2021杭电多校1

题号题目知识点AMod, Or and Everything思维数论BRocket landCPuzzle loopDAnother thief in a ShopEMinimum spanning tree推结论欧拉筛FXor sum01字典树GPass!HMaximal submatrix单调栈IKD-GraphJzotoKNecklace of Beads

P4775 [NOI2018] 情报中心(线段树合并)

前言 似乎也没有那么难&#xff1f; 但确实也不太好想。 解析 对于两条有交路径 (u1,v1,c1),(u2,v2,c2)(u_1,v_1,c_1),(u_2,v_2,c_2)(u1​,v1​,c1​),(u2​,v2​,c2​)&#xff0c;设 tlca(u1,u1)tlca(u_1,u_1)tlca(u1​,u1​) 为四个 lca 中最深的&#xff0c;那么代价的二…

[骗分技巧——随机化Ⅱ] [Poi2014]Couriers,CodeChef - TKCONVEX

文章目录[Poi2014]CouriersproblemsolutioncodeCodeChef - TKCONVEXproblemsolutioncode随机算法的典型套路&#xff1a;枚举太花时&#xff0c;转化为随机一个数。然后通过对正确率的分析&#xff0c;选择一个随机的次数来卡。前提是要保证每一次检验随机是否为答案的时间复杂…

[NewLife.XCode]功能设置

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代表作有百亿级大数据实时计算项…