最大正方形_纪中2548
来源:互联网 发布:淘宝没有电脑客户端吗 编辑:程序博客网 时间:2024/06/01 17:22
Description
给一个N*N的01矩阵, 求一个面积最大的全为1的正方形子矩阵. 输出它的面积.
Input
输入文件square.in的第一行包含一个正整数N.
接下来N行, 每行N个数, 保证不是0就是1. 每行相邻两个数之间没有空格.
Output
输出文件为square.out,仅包含一个整数表示最大的全1子正方形矩阵的面积。
Hint
[数据规模和约定]
80%的数据中 N<=250;
100%的数据中 N <= 1000。
题解
二分正方形的边长,枚举是1的起始点,查找更新答案
code
#include <stdio.h>#include <iostream>using namespace std;int x[1011001],y[1011001];int map[1111][1111];int f[1111][1111];char c[1111];int acre(int i,int j,int k){ return f[i+k-1][j+k-1]-f[i-1][j+k-1]-f[i+k-1][j-1]+f[i-1][j-1];}bool check(int i,int j,int k){ return acre(i,j,k)==k*k;}int main(){ int n,ans=0,count=0; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%s",&c); for (int j=1;j<=n;j++) { map[i][j]=(int)(c[j-1])-48; if (map[i][j]) { x[++count]=i; y[count]=j; } } } for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+map[i][j]; int l=1,r=n; while (l<=r) { int mid=(l+r)/2; int k=mid; bool flag=false; for (int v=1;v<=count;v++) { if ((x[v]+k-1<=n)&&(y[v]+k-1<=n)&&check(x[v],y[v],k)) { flag=true; if (acre(x[v],y[v],k)>ans) ans=acre(x[v],y[v],k); break; } } if (flag) l=mid+1; else r=mid-1; } printf("%d\n",ans); return 0;}
0 0
- 最大正方形_纪中2548
- 最大正方形
- 最大正方形
- 最大正方形
- 最大正方形
- 最大正方形
- 最大正方形
- 最大正方形
- 三条线_纪中_2929_最大匹配
- [LeetCode] 01矩阵中最大正方形 Maximal Square
- DP---求给定矩阵中最大正方形的维度
- 在矩阵中寻找最大正方形连续区域
- 最大正方形 (Largest Square)
- 最大子正方形
- FZU 2056 最大正方形
- 找最大的正方形
- FZU 2056 最大正方形
- 01矩阵最大正方形
- 1857. 最大值 (Standard IO)
- QtCreator 网络编程——Udp模型(QUdpSocket)
- Javascript——事件对象(操作指南)
- 如何稀释onscroll事件的原理
- 数字游戏
- 最大正方形_纪中2548
- hadoop2.2.0伪分布式搭建
- 家庭作业 (Standard IO)
- java中静态代码块的用法 static用法详解
- 【GDOI2017模拟8.12】躲藏
- java内存泄露和内存溢出
- springMVC学习笔记---day02 springMVC+spring+mybatis整合开发框架搭建
- Spring Boot 快速入门
- 文件上传 Servlet3.x SpringMvc