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

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

嗯...

 

题目链接:https://www.luogu.org/problem/P1387

 

这道题有很多种做法,可以dp、暴力,而这里介绍的是前缀和做法。

首先输入后维护一个前缀和,然后遍历这个矩阵,当g[i][j]为1,l(边长)初始化为1,然后枚举边长伸长长度k,并且注意边界,然后对于每一个伸长后的矩形面积,进行差分,如果这个面积等于(k + 1) ^ 2,那么说明你现在这个状态它是一个正方形,边长++。然后ans取max即可。

 

AC代码:

1 #include
2 #include
3 4 using namespace std; 5 const int maxn = 205; 6 int n, m, g[maxn][maxn], s[maxn][maxn], l, ans; 7 8 int main(){ 9 scanf("%d%d", &n, &m);10 for(int i = 1; i <= n; i++){11 for(int j = 1; j <= m; j++){12 scanf("%d", &g[i][j]);13 s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + g[i][j];//前缀和 14 }15 }16 for(int i = 1; i <= n; i++){17 for(int j = 1; j <= m; j++){18 if(g[i][j]){19 l = 1;//初始化 20 ans = max(l, ans);21 for(int k = 1; (k + i) <= n && (k + j) <= m; k++){
//枚举伸长长度,判边界 22 if(s[i + k][j + k] - s[i - 1][j + k] - s[i + k][j - 1] + s[i - 1][j - 1] == (k + 1) * (k + 1))//差分判断面积是否相同 23 l++;//边长++ 24 ans = max(ans, l);25 }26 }27 }28 }29 printf("%d\n", ans);30 return 0;31 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11256338.html

你可能感兴趣的文章
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>
读书笔记:季羡林关于如何做研究学问的心得
查看>>
面向对象的优点
查看>>
套接口和I/O通信
查看>>
阿里巴巴面试之利用两个int值实现读写锁
查看>>
浅谈性能测试
查看>>
Winform 菜单和工具栏控件
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
深入理解jQuery框架-框架结构
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>