zoukankan      html  css  js  c++  java
  • [USACO5.3]巨大的牛棚Big Barn

    题目背景

    (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

    说明

    题目翻译来自NOCOW。

    USACO Training Section 5.3

    思路

    DP方程:f[i][j]=min(f[i-1][j-1],f[i-1][j],f[i][j-1])+1;

    代码实现

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int maxn=1e3+10;
     5 int n,t,ans;
     6 int f[maxn][maxn];
     7 bool v[maxn][maxn];
     8 int main(){
     9     scanf("%d%d",&n,&t);
    10     int a,b;
    11     for(int i=1;i<=t;i++){
    12         scanf("%d%d",&a,&b);
    13         v[a][b]=true;
    14     }
    15     for(int i=1;i<=n;i++)
    16     for(int j=1;j<=n;j++)
    17     if(!v[i][j]) ans=max(ans,f[i][j]=1+min(f[i-1][j-1],min(f[i-1][j],f[i][j-1])));
    18     printf("%d
    ",ans);
    19     return 0;
    20 }

     顺便,P1387 最大正方形也可以怎么做,或者O(n3)暴力可过;

  • 相关阅读:
    flink RECEIVED SIGNAL 15: SIGTERM. Shutting down as requested
    hive 正则
    scala.sys.process
    python多版本管理
    行式存储和列式存储
    Windows Latex 中日文字体设置例
    perl笔记
    wordpress plugins collection
    【转载】Windows 7下使用bcdedit删除多余启动项的命令
    修改MySQL密码
  • 原文地址:https://www.cnblogs.com/J-william/p/7422219.html
Copyright © 2011-2022 走看看