【二分+复杂度分析】2017.5.21杂题[最大矩阵]题解
来源:互联网 发布:什么是云计算和云服务 编辑:程序博客网 时间:2024/06/01 09:34
题目概述
给出一个有权值的矩阵,选出一个子矩阵(长>1且宽>1),子矩阵的权值定义为四个角上的最小值。求最大权值的子矩阵。
解题报告
直接刷最大值很难避免枚举所有情况,所以这并不是很好办。
由于是在最小值中求最大值,我们想到了二分答案。二分答案mid之后,我们就可以把权值矩阵变成01矩阵(>=mid的格子为1,<mid的格子为0)。然后我们只需要验证能否选4个1使他们形成矩阵。
如果枚举两行然后扫描列判断是否成立,验证效率是
但这个方法是
示例程序
#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;}
阅读全文
2 0
- 【二分+复杂度分析】2017.5.21杂题[最大矩阵]题解
- 【题解】最大零矩阵
- 最大子矩阵 题解
- 最大子矩阵题解
- 二分查找时间复杂度分析
- 【BZOJ1084】【杂题DP】[SCOI2005]最大子矩阵 题解
- 【复杂度分析】HDU5762[Teacher Bo]题解
- 【二分+匈牙利】BZOJ4443(Scoi2015)[小凸玩矩阵]题解
- BZOJ3993 星际战争 题解(二分+最大流)
- bzoj 1084: [SCOI2005]最大子矩阵 题解
- 【DP】BZOJ1084(SCOI2005)[最大子矩阵]题解
- 二分查找时间复杂度计算与分析
- [二分+二分图匹配]BZOJ 4443: [Scoi2015]小凸玩矩阵 题解
- 【二分图最大匹配】矩阵游戏
- HDU 2819 矩阵 最大二分匹配
- [bzoj4443][SCOI2015]小凸玩矩阵 最大流+二分
- BZOJ4443(Scoi2015)[小凸玩矩阵]--二分+二分图最大匹配
- BZOJ4443[Scoi2015][小凸玩矩阵] 二分图最大匹配+二分
- Keepalived之——*** WARNING
- Ubuntu安装telnet
- USACO Section1.1 Your Ride Is Here
- SonicOperator之算法优化
- vs编译COM无权限注册
- 【二分+复杂度分析】2017.5.21杂题[最大矩阵]题解
- 167. Two Sum II
- 构建链表、输出链表元素、删除链表…
- 用队列和栈的功能实现回文的判定
- WPF学习感受
- 未声明的标识符SurfFeatureDetecto…
- Moving Tables
- java8(1)lambda表达式
- Matlab中Simulink的Bus/Mux/Dumx模块详解