vijos 1057 盖房子 dp 最大子正方形

P1057盖房子

未递交

标签:[显示标签]

描述

永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的。

但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦。

他希望找到一块最大的正方形无瑕疵土地来盖房子。

不过,这并不是什么难题,永恒の灵魂在10分钟内就轻松解决了这个问题。

现在,您也来试试吧。

格式

输入格式

输入文件第一行为两个整数n,m(1<=n,m<=1000),接下来n行,每行m个数字,用空格隔开。0表示该块土地有瑕疵,1表示该块土地完好。

输出格式

一个整数,最大正方形的边长。

样例1

样例输入1[复制]

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

样例输出1[复制]

2

限制

各点时限均为1s。

来源

永恒の灵魂根据经典问题改编(超级弱智题)

子矩阵n^3,单调栈应该也可以;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll __int64
#define esp 0.00000000001
const int N=1e3+10,M=1e6+10,inf=1e9+10,mod=1000000007;
int a[N][N];
int dp[N][N];
int main()
{
    int x,y,z,i,t,j,k;
    while(~scanf("%d%d",&x,&y))
    {
        for(i=1;i<=x;i++)
            for(t=1;t<=y;t++)
                scanf("%d",&a[i][t]);
        int ans=0;
        for(i=1;i<=x;i++)
        {
            for(t=1;t<=y;t++)
            {
                if(a[i][t])dp[i][t]=min(dp[i-1][t-1],min(dp[i][t-1],dp[i-1][t]))+1;
                ans=max(dp[i][t],ans);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-11-02 13:48:31

vijos 1057 盖房子 dp 最大子正方形的相关文章

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

盖房子(house)

盖房子(house) 题目描述 FJ最近得到了面积为n*m的一大块土地,他想在这块土地上建造一所房子,这个房子必须膏形的.但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这些瑕疵十分以至于根本不能在上面盖一砖一瓦.他希望找到一块最大的正方形无瑕疵土地来盖房子.不过,不是什么难题,FJ在10分钟内就轻松解决了这个问题.现在,您也来试试吧. 输入 第1行为两个整数n,m(1≤n,m≤100).接下来n行,每行m个数字,用空格隔开.0表萄土地有瑕疵,1表示该块土地完好. 输出 一个

tyvj1189 盖房子

描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的.但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦.他希望找到一块最大的正方形无瑕疵土地来盖房子.不过,这并不是什么难题,永恒の灵魂在10分钟内就轻松解决了这个问题.现在,您也来试试吧. 输入格式 输入文件第一行为两个整数n,m(1<=n,m<=1000),接下来n行,每行m个数字,用空格隔开.0表示该块

【动态规划】盖房子(house)--未提交

问题 D: 盖房子(house) 时间限制: 1 Sec  内存限制: 64 MB提交: 27  解决: 16[提交][状态][讨论版] 题目描述 FJ最近得到了面积为n*m的一大块土地,他想在这块土地上建造一所房子,这个房子必须膏形的.但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这些瑕疵十分以至于根本不能在上面盖一砖一瓦.他希望找到一块最大的正方形无瑕疵土地来盖房子.不过,不是什么难题,FJ在10分钟内就轻松解决了这个问题.现在,您也来试试吧. 输入 第1行为两个整数n

vijos 1243 生产产品 DP + 单调队列优化

LINK 题意:有1个产品,m个步骤编号为1~m.步骤要在n个机器人的手中生产完成.其中,第i个步骤在第j个机器人手中的生产时间给定为$T[i][j]$,切换机器人消耗cost.步骤必须按顺序,同一个机器人不能连续完成超过l个步骤.求完成所有步骤的最短时间是多少.其中$m<=10^5$,$n<=5$,$l<=5*10^4$ 思路:这题用DP考虑易得一个转移方程$dp[i][j]=\min^{i-1}_{v=i-L}{(dp[v][x] + sum[i][j] - sum[v][j]) +

Vijos1057 盖房子(DP经典题)

之前没有怎么刷过dp的题,所以在此学习了~(感谢walala大神的思路,给了我很大的启发) 也算是自己学习的另一种dp题型吧 先贴上状态转移方程: if(a[i][j]) f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1 然后更新ans即可 详细的解释一下这个状态转移方程的意义 F[i-1,j] 表示向左能延伸的最大长度 F[i-1,j-1] 表示沿对角线延伸的最大长度 F[i,j-1] 表示向上能延伸的最大长度 很多人一开始不明白为什么明明

FJ最近得到了面积为n*m的一大块土地,他想在这块土地上建造一所房子,这个房子必须膏形的。但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。这些瑕疵十分以至于根本不能在上面盖一砖一瓦。他希望找到一块最大的正方形无瑕疵土地来盖房子。不过,不是什么难题,FJ在10分钟内就轻松解决了这个问题。 现在,您也来试试吧。

#include <stdio.h>int qiu(int x,int y){ if(x==1&&y==1)return 1; else return 0;} int main(){ int maxx=1; int a[100][100]; int x,y,i,j; scanf("%d %d",&x,&y); for(i=0;i<x;i++) { for(j=0;j<y;j++) { scanf("%d",&a

Vijos p1518河流 树形DP

https://vijos.org/p/1518 这题代码我基本是抄的,实在太难想了.但是也学到了一些东西. 比如:多叉树转二叉树存,这个细细一想,确实使得在dfs的时候,实现起来方便很多. 说一说具体 dfs的思路,思路和网上那个一模一样的,我刚学树形dp,可能上网看看总结下套路比较好. 设dfs(cur, hasPoint, k, dis)表示,现在处理到cur这个节点,离cur最近的那个仓库节点是hasPoint, 剩下k次设置仓库的机会,还有就是cur的爸爸距离hasPoint的距离.

lintcode 中等题:Maximal Square 最大子正方形

题目: Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area. 样例 For example, given the following matrix: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 Return 4. 解题: 给定一个二维01矩阵,从中找出最大的全