博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu p1387 最大正方形
阅读量:5332 次
发布时间:2019-06-14

本文共 746 字,大约阅读时间需要 2 分钟。

原题链接:https://www.luogu.org/problem/show?pid=1387

 

理论上来说可以暴力枚举边长和右下角坐标,而且似乎有人能用这方法过这道题。。。

不过枚举太不现实,而且数据强一点的话就彻底没办法了,还是要DP。

用两个数组l,w分别存储每个位置(包括本身)向左和向上各有几个连续的1,如果一个位置是1,这个位置的w和l就能从别的位置转移过来。(似乎预处理能与输入一起完成?不过我没这么做。)

然后对f数组进行处理,对于每一个正方形,我们都可以把它看作是一层一层的,像这样:

第一层:

1

第二层:

0 1

1 1

第三层:

0 0 1

0 0 1

1 1 1

如果能构成正方形,那么前面的几层都必须是完整的。对于每一个a[i][j]==1的位置,f[i][j]的取值为f[i-1][j-1]+1,l[i][j]与w[i][j]的最小值

插一句,luogu上数据略水,处理f的时候把m写成n居然都有90分。。。

 

#include
void read(int &y){ y=0;char x=getchar(); while(x<'0'||x>'9') x=getchar(); while(x>='0'&&x<='9') { y=y*10+x-'0'; x=getchar(); }}int n,m,a[105][105],ans;int f[105][105],l[105][105],w[105][105];int min(int x,int y){ if(x

 

转载于:https://www.cnblogs.com/zeroform/p/7566589.html

你可能感兴趣的文章
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
Code Snippet
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>