hdu4846 最大子正方形(dp)
题意:
给你一个图,让你找到最大的子矩形。
思路:
之前做过一个最大子矩阵,记得当时是用三种方法做的,两种都是瓶颈法,第三种是dp,结果今天的用瓶颈吧怎么都过不去,哎!不知道为什么,后来没办法有写了和dp顺利ac了,我们求最大子矩阵的时候是记录最大的长*宽,这次只要记录最大的min(长,宽),就行了,说下这个题目的dp做法吧,只要是开三个数组,L[],R[],sum[],sum是记录当前点的上面有多少个连续的1,L是记录当前点sum大于等于左边的最远的那个数的下标(连续大于),R则是又边,则我们可以一边更新sum一边更新L,R和ans,主要核心如下
for(i = 1 ;i <= n ;i ++)
{
for(j = 1 ;j <= n ;j ++)
map[i][j] == '.' ? sum[j] ++ : sum[j] = 0;//更新当前点上面有多少个连续1
//更新当前点左边连续大于的最远
L[1] = 1;
for(j = 2 ;j <= n ;j ++)
{
int k = j;
while(k > 1 && sum[j] <= sum[k-1]) k = L[k-1];
L[j] = k;
}
//更新当前点右边连续大于的最远
R[1] = n;
for(j = n - 1 ;j >= 1 ;j --)
{
int k = j;
while(k > 1 && sum[j] <= sum[k+1]) k = R[k+1];
R[j] = k;
}
// 更新答案
for(j = 1 ;j <= n ;j ++)
{
int now = min(R[j] - L[j] + 1 ,sum[j]);
if(ans < now) ans = now;
}
}
ok核心就是这些,时间复杂度是O(n^2)
#include<stdio.h>
#include<string.h>
int L[1111] ,R[1111] ,sum[1000];
int map[1111][1111]; int minn(int x ,int y)
{
return x < y ? x : y;
} int main ()
{
int n ,m ,i ,j;
int ans ,x ,y;
while(~scanf("%d %d" ,&n ,&m))
{
memset(map ,255 ,sizeof(map));
memset(sum ,0 ,sizeof(sum));
while(m--)
{
scanf("%d %d" ,&x ,&y);
map[x][y] = 0;
}
for(ans = 0 ,i = 1 ;i <= n ;i ++)
{
for(j = 1 ;j <= n ;j ++)
map[i][j] ? sum[j] ++ : sum[j] = 0;
L[1] = 1;
for(j = 2 ;j <= n ;j ++)
{
int k = j;
while(k > 1 && sum[j] <= sum[k-1]) k = L[k-1];
L[j] = k;
}
R[n] = n;
for(j = n - 1 ;j >= 1 ;j --)
{
int k = j;
while(k < n && sum[j] <= sum[k+1]) k = R[k+1];
R[j] = k;
}
for(j = 1 ;j <= n ;j ++)
{
int now = minn(R[j] - L[j] + 1 ,sum[j]);
if(ans < now) ans = now;
}
}
printf("%d\n" ,ans);
}
return 0;
}
hdu4846 最大子正方形(dp)的更多相关文章
- vijos 1057 盖房子 dp 最大子正方形
P1057盖房子 未递交 标签:[显示标签] 描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美 ...
- lintcode:最大子正方形
题目: Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square contain ...
- P1387 最大正方形 dp
思路: i j的最大正方形等于min(他的斜上方的的最大正方形,他的上方有的连续1,他的左方有的连续1)+1 #include<bits/stdc++.h> using namespac ...
- 計蒜客/數正方形(dp)
題目鏈接:https://nanti.jisuanke.com/t/44 題意:中文題誒~ 思路: 用dp[i][j]存儲以(i, j)爲左上定點的最大正方形變長,從右下角網左上角一次計算所有頂點: ...
- [LeetCode] 221. 最大正方形(DP)
题目 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 ...
- 最大子阵 DP or 前缀和orb暴力 能过
在一个给定的n*m二维矩阵中求一个子矩阵元素和的最大值. 思路: 1:一个二维矩阵由两个点可以确定,枚举两个点,取子矩阵最大值. 2:在一维矩阵中,求一个序列的最大子段,利用 f[i]=max(f[i ...
- 洛谷P1736 创意吃鱼法 dp
正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...
- [洛谷P1169] [ZJOI2007] 棋盘制作 解题报告(悬线法+最大正方形)
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个 8×8 大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历
剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...
- 定西+简单dp
定西 ECNU-3531 #include<iostream> #include<cstdio> #include<algorithm> #include<c ...
- 02----python入门----基本数据类型
关于数据分类依据 一.数字型(int) Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,在64位系 ...
- Jmeter 分布式架构和服务器性能监控解决方案
在对项目做大并发性能测试时,常会碰到并发数比较大(比如需要支持10000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能来搭建分布式并发环境 . 一. ...
- mongodb为什么比mysql效率高
首先是内存映射机制,数据不是持久化到存储设备中的,而是暂时存储在内存中,这就提高了在IO上效率以及操作系统对存储介质之间的性能损耗.(毕竟内存读取最快) 其次,NoSQL并不是不使用sql,只是不使用 ...
- 模拟实现AMD模块化规范
目录 引子 再谈什么是闭包(闭包的产生)? 词法作用域 回到闭包 利用闭包编写模块 实现AMD模块化规范 写在最后 引子 本文最后的目的是模拟实现AMD模块化规范,而写下本文的原因是今天阅读到了< ...
- DNA序列(JAVA语言)
package 第三章习题; /* * 输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小. * 两个等长字符串的Hamming距离等于字符不同的位置个数, ...
- 攻防世界 reverse 进阶 10 Reverse Box
攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...
- 在Windows下配置Linux远程开发环境
在Windows下配置Linux远程开发环境 欢迎光临我的个人博客 https://source.chens.life/Configure-Linux-remote-development-envir ...
- java例题_01 不死神兔!
1 /*1 [程序 1 不死神兔] 2 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 3 程 ...