【二分+复杂度分析】2017.5.21杂题[最大矩阵]题解
2017-05-29 10:24
281 查看
题目概述
给出一个有权值的矩阵,选出一个子矩阵(长>1且宽>1),子矩阵的权值定义为四个角上的最小值。求最大权值的子矩阵。解题报告
直接刷最大值很难避免枚举所有情况,所以这并不是很好办。由于是在最小值中求最大值,我们想到了二分答案。二分答案mid之后,我们就可以把权值矩阵变成01矩阵(>=mid的格子为1,<mid的格子为0)。然后我们只需要验证能否选4个1使他们形成矩阵。
如果枚举两行然后扫描列判断是否成立,验证效率是O(n2∗m)的,无法承受。除了这种方法,效率较高又容易想到的验证就只有这种了:枚举一行,存下这一行为1的格子,选排枚举这些格子,用vis[i][j]表示i列和j列是否可以均为1,如果在枚举i,j的时候发现vis[i][j]=true,说明之前就有一行可以同时选i,j,此时验证成功,否则将vis[i][j]赋为true。
但这个方法是O(n∗m2)的,好像也无法承受。其实不然,这个方法是O(m2)的!因为一旦遇到vis[i][j]=true就验证成功返回,否则才将vis[i][j]修正为true。那么也就是说任何i,j只会遇到一次,所以效率是O(m2)的。
示例程序
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=2000,maxm=2000,MAXINT=((1<<30)-1)*2+1; int n,m,num[maxn+5][maxm+5],now[maxm+5]; bool vis[maxn+5][maxm+5]; char readc() { static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; else return *(l++); } bool Eoln(char ch) {return ch==10||ch==13||ch==EOF;} int readi(int &x) { int tot=0,f=1;char ch=readc(),lst='+'; while ('9'<ch||ch<'0') {if (ch==EOF) return EOF;lst=ch;ch=readc();} if (lst=='-') f=-f; while ('0'<=ch&&ch<='9') tot=tot*10+ch-48,ch=readc(); x=tot*f; return Eoln(ch); } bool check(int MIN) { memset(vis,0,sizeof(vis)); for (int i=1;i<=n;i++) { now[0]=0; for (int j=1;j<=m;j++) if (num[i][j]>=MIN) now[++now[0]]=j; for (int i=1;i<=now[0]-1;i++) for (int j=i+1;j<=now[0];j++) if (vis[now[i]][now[j]]) return true; else vis[now[i]][now[j]]=true; } return false; } int main() { freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); readi(n);readi(m); int L=MAXINT,R=-MAXINT; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) readi(num[i][j]),L=min(L,num[i][j]),R=max(R,num[i][j]); while (L<=R) { int mid=L+(R-L>>1); if (check(mid)) L=mid+1; else R=mid-1; } printf("%d\n",R); return 0; }
相关文章推荐
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 数值分析 幂法求矩阵A按模最大的特征值和相应的特征向量
- 【二分图最大匹配】矩阵游戏
- 分析时间复杂度&空间复杂度,以二分查找和斐波那契数的递归和非递归算法为例
- 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配
- 4443: [Scoi2015]小秃玩矩阵 二分答案+最大流
- 【BZOJ4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
- 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
- [BZOJ]4443 [SCOI2015] 小凸玩矩阵 二分答案 + 二分图最大匹配
- HDU 2819 矩阵 最大二分匹配
- [bzoj4443][Scoi2015]小凸玩矩阵(二分答案+二分图最大匹配)
- BZOJ4443(Scoi2015)[小凸玩矩阵]--二分+二分图最大匹配
- 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配
- BZOJ 4443: [Scoi2015]小凸玩矩阵 二分图最大匹配+二分
- 求最大连续子列和的算法和时间复杂度的分析(包含四种不同时间复杂度的算法)
- HDU 2236 矩阵不同行列寻找 最小最大数的差值 最小 二分匹配+二分枚举区间
- 【BZOJ 4443】 [Scoi2015]小凸玩矩阵|二分|最大匹配|匈牙利
- BZOJ4443[Scoi2015][小凸玩矩阵] 二分图最大匹配+二分
- [bzoj4443][SCOI2015]小凸玩矩阵 最大流+二分
- 分析称火狐将是Facebook最大竞争对手