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 ...
随机推荐
- WEB容器开启、关闭OPTIONS方法
发现 请求包随意,响应包信息如下: HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Vary ...
- C++指针的算术运算 、关系运算
下面随笔是关于指针的算术运算 .关系运算. 指针类型的算术运算 指针与整数的加减运算 指针++,--运算 指针类型的算术运算 指针p加上或减去n 其意义是指针当前指向位置的前方或后方第n个数据的起始位 ...
- Java数据类型拓展
public class Demo03 { public static void main(String[] args) { //整数拓展: 二进制0b 十进制 八进制0 十六进制0x int i = ...
- MarkFormat,一个在Word中使用Mark进行格式化的插件
MarkFormat(标记格式化),是一款在Word中基于标记进行格式化的工具. 让我们看下具体效果. 首先是有标记的文本 点击格式化之后 点击去除标记之后(去除标记也会进行格式化) 如果想要恢复标记 ...
- SVN同步方式举例 FreeBSD
FreeBSD base 默认安装了svnlite 不需要单独安装SVN 软件 svnlite co svn.freebsd.org/ports/head/ /usr/local/ports -r5 ...
- golang 并发运算时主线程先运行完,子线程运行没结束的问题记录
代码如下: blocks,err:= mgo.FindBlocks(batch) //获得当前批次下的矿体信息 cubes:= BlockCutting(blocks[0],x,y,z,nest) f ...
- 走进docker-初识
什么是Docker容器? 容器是打包代码及其所有依赖项的软件的标准单元,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境.Docker容器映像是一个轻量级的,独立的,可执行的软件软件包,其 ...
- 实验: survivor放不下的对象进入老年代
实验一: 存活对象包含 小于survivor大小的对象 + 大于survivor的对象 private static final Integer _1MB = 1024 * 1024; /** * - ...
- P1177【模板】快速排序(JAVA语言)
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util ...
- vue 快速入门 系列 —— vue 的基础应用(上)
其他章节请看: vue 快速入门 系列 vue 的基础应用(上) Tip: vue 的基础应用分上下两篇,上篇是基础,下篇是应用. 在初步认识 vue一文中,我们已经写了一个 vue 的 hello- ...