[USACO5.3]巨大的牛棚Big Barn && 洛谷【p1387】最大正方形(动态规划)

来源:互联网 发布:mac解压软件破解版 编辑:程序博客网 时间:2024/05/24 07:36

题目背景

(USACO 5.3.4)

题目描述

农夫约翰想要在他的正方形农场上建造一座正方形大牛棚。他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方。我们假定,他的农场划分成 N x N 的方格。输入数据中包括有树的方格的列表。你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚。牛棚的边必须和水平轴或者垂直轴平行。

EXAMPLE

考虑下面的方格,它表示农夫约翰的农场,‘.’表示没有树的方格,‘#’表示有树的方格

1 2 3 4 5 6 7 8

1 … … . .

2 . # … # . .

3 … … . .

4 … … . .

5 … … . .

6 . . # … . .

7 … … . .

8 … … . .

最大的牛棚是 5 x 5 的,可以建造在方格右下角的两个位置其中一个。

输入输出格式

输入格式:
Line 1: 两个整数: N (1 <= N <= 1000),农场的大小,和 T (1 <= T <= 10,000)有树的方格的数量

Lines 2..T+1: 两个整数(1 <= 整数 <= N), 有树格子的横纵坐标

输出格式:
只由一行组成,约翰的牛棚的最大边长。

输入输出样例

输入样例#1:
8 3
2 2
2 6
6 3
输出样例#1:
5

题解(巨大的牛棚):

#include<iostream>#include<cstdio>using namespace std;int map[1005][1005];int dp[1005][1005];int main(){    int n,t;    scanf("%d%d",&n,&t);    for(int i=1;i<=t;i++)    {        int x,y;        scanf("%d%d",&x,&y);        map[x][y]=1;    }    int ans=0;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            if(!map[i][j])//如果没有树木,那正方形的边长就是它左上、上方、左方最小值的答案+1            {                dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;                ans=max(ans,dp[i][j]);            }        }    }    printf("%d",ans);    return 0;}

——————————————————–分割线————————————————————————————————-

题目描述

在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。

输入输出格式

输入格式:
输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.

输出格式:
一个整数,最大正方形的边长

输入输出样例

输入样例#1:
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
输出样例#1:
2

题解:(最大正方形):

#include<iostream>#include<cstdio>using namespace std;int a[105][105];int dp[105][105];int main(){    int n,m;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            scanf("%d",&a[i][j]);        }    }    int ans=0;                                                                               for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if(a[i][j])            {                dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;                ans=max(ans,dp[i][j]);            }               }    }    printf("%d",ans);    return 0;}
原创粉丝点击