洛谷 P1387 最大正方形 Label:奇怪的解法
题目描述
在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。
输入输出格式
输入格式:
输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.
输出格式:
一个整数,最大正方形的边长
输入输出样例
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
2
解法1
提供一种很简单的思路。要验证(i,j)能表示多大的正方形的末尾,就要验证(i-1,j)(i,j-1)(i-1,j-1)这三个点中能作为正方形末尾的最小值,然后加上一即可。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define min3(a,b,c) min(a,min(b,c))
using namespace std;
int ans,a[][],f[][],N,M;
int main(){
// freopen("01.txt","r",stdin);
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++){
for(int j=;j<=M;j++){
f[i][j]=;
scanf("%d",&a[i][j]);
}
} for(int i=;i<=N;i++){
for(int j=;j<=M;j++){
f[i][j]=a[i][j]*(min3(f[i-][j],f[i-][j-],f[i][j-])+);
ans=max(ans,f[i][j]);
}
} printf("%d\n",ans);
return ;
}
解法2
这个题可以应用二维数组前缀和来求解。
因为只有01这两个数,所以求前缀和会很方便的求助面积来,这样也可以很方便的找到最大边长。
注意前缀和的求法和面积的表示方法,对于二维数组的前缀和,先像一维数组那样求一遍每行的前缀和,再将每一个前缀和加上自己上面的点的前缀和。
而面积的表示:对于i,j点边长为l的正方形,前缀和表示:sum[i][j]-sum[i-l][j]-sum[i][j-l]+sum[i-l][j-l]至于为什么,大家可以自己写几组数据试试。
代码
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int n,m,ans,ans2;
int mapp[][];
int sum[][];
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&mapp[i][j]);
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++)
sum[i][j]=sum[i][j-]+mapp[i][j];
for (int j=;j<=m;j++)
sum[i][j]+=sum[i-][j];
}
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++)
{
for (int l=;l<=min(i,j);l++)
{
if(mapp[i][j]==&&l*l==sum[i][j]-sum[i-l][j]-sum[i][j-l]+sum[i-l][j-l])
{
if(ans<sum[i][j]-sum[i-l][j]-sum[i][j-l]+sum[i-l][j-l])
{ans2=l;
ans=sum[i][j]-sum[i-l][j]-sum[i][j-l]+sum[i-l][j-l];}
}
}
}
}
printf("%d\n",ans2);
return ;
}
洛谷 P1387 最大正方形 Label:奇怪的解法的更多相关文章
- 洛谷 p1387最大正方形
洛谷 p1387最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来 ...
- 洛谷P1387 最大正方形
题目描述 题目链接:https://www.luogu.org/problemnew/show/P1387 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输 ...
- 洛谷 P1387 最大正方形 【dp】(经典)
题目链接:https://www.luogu.org/problemnew/show/P1387 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式: 输入 ...
- 洛谷 [P1387] 最大正方形
本题非常有趣. (n^6) 枚举四个端点,每次遍历矩阵求解. (n^4) 先处理前缀和,枚举四个端点,每次比较前缀和和正方形面积. (n^3) 枚举左上方端点,在枚举边长,前缀和优化 (n^2logn ...
- 洛谷P1387最大正方形(dp,前缀和)
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- (Java实现) 洛谷 P1387 最大正方形
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- [洛谷1681]最大正方形II
思路:对于矩阵中的每一个元素,处理出它能扩展到的上边界$up$.左边界$left$,DP得出以该元素为右下角的最大正方形.状态转移方程:$f_{i,j}=min(f_{i-1,j-1},up_{i,j ...
- 洛谷P1681 最大正方形II
P1681 最大正方形II 题目背景 忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到 了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上 ...
- 洛谷 P2726 阶乘 Factorials Label:Water
题目背景 N的阶乘写作N!,表示小于等于N的所有正整数的乘积. 题目描述 阶乘会变大得很快,如13!就必须用32位整数类型来存储,到了70!即使用浮点数也存不下了. 你的任务是找到阶乘最前面的非零位. ...
随机推荐
- vim 支持C++11 lambda表达式
http://www.vim.org/scripts/script.php?script_id=3797 Tar contains just the required .vim files, so u ...
- 探索ASP.NET MVC框架之控制器的查找与激活机制
引言 前面一篇博文我们介绍了MVC框架的路由机制,我们知道一个URL请求如何从ASP.NET处理管线到达了IHttpHandler实例(MvcHandler).今天我们从MvcHandler来进行下一 ...
- Cufflinks
Transcriptome assembly and differential expression analysis for RNA-Seq. Cufflinks assembles transcr ...
- MySQL字段自增长AUTO_INCREMENT的学习笔记
1.创建表时指定AUTO_INCREMENT自增值的初始值(即起始值): CREATE TABLE XXX (ID INT(5) PRIMARY KEY AUTO_INCREMENT) AUTO_IN ...
- Linux下提示 bash: xxx command not found
今天在虚拟机上安装了CentOS5.5,发现运行一些很正常的诸如:init,shutdown,fdisk 等命令时,悍然提示: bash: xxx command not found. 那么,首先就要 ...
- vue2.0学习(一)
1.解决双花括号在初始化时的闪烁,两种方式,一种是<div v-text="name"></div>,将用v-text指令来显示,类似于angular的ng ...
- Android下如何计算两经纬点之间距离
节选自百度地图API: 若开发者使用的是百度地图或定位API,且版本在1.3.5以后的, 路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法. 如果是计算任 ...
- opencv常见代码
http://blog.csdn.net/lyc_daniel/article/details/16883707
- Spring MVC+FreeMarker简介
最近做项目,刚接触到SpringMVC与FreeMarker框架,就简单介绍一下自己的理解,不正确的地方请大家指教!! 1.Spring MVC工作原理: 用户发送请求--->前端服务器去找相对 ...
- PHP PDO的setAttribute函数
数据库的连接: $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=cardslg'; $username = 'root'; $password = ''; ...