news 2026/8/13 23:48:38

题解:洛谷 P2701 [USACO5.3] 巨大的牛棚 Big Barn

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
题解:洛谷 P2701 [USACO5.3] 巨大的牛棚 Big Barn

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:P2701 [USACO5.3] 巨大的牛棚 Big Barn

【题目描述】

FJ 有一个大小为n × n n\times nn×n的农场(1 ≤ n ≤ 1000 1\le n\le 10001n1000),他想要在他的农场上建造一座正方形大牛棚。他的农场中有t tt棵果树(1 ≤ t ≤ 10000 1\le t\le100001t10000),但他为了不破坏果树,就想找一个空旷无树的地方修建牛棚。你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚的边长。当然,牛棚的边必须和水平轴和垂直轴平行。

考虑下面的农场,.表示没有树的方格,#表示有树的方格。

0 1 2 3 4 5 6 7 8 1 . . . . . . . . 2 . # . . . # . . 3 . . . . . . . . 4 . . . . . . . . 5 . . . . . . . . 6 . . # . . . . . 7 . . . . . . . . 8 . . . . . . . .

最大的牛棚是边长为5 55的,可以建造在农场右下角的两个位置其中一个。

【输入】

1 11行输入两个正整数n nnt tt

2 ∼ t + 1 2\sim t+12t+1行输入两个正整数x , y ( 1 ≤ x , y ≤ n ) x,y\ (1\le x,y\le n)x,y(1x,yn)

【输出】

只由一行组成,约翰的牛棚的最大边长。

【输入样例】

8 3 2 2 2 6 6 3

【输出样例】

5

【核心思想】

  1. 问题分析:给定n × n n \times nn×n的网格,其中有t tt个位置有树(障碍物),求边与坐标轴平行的最大正方形空区域(不含树)的边长。这是一个二维 DP问题,关键在于状态设计能递推地利用子问题的最优解。

  2. 算法选择

    • 二维动态规划:设d p [ i ] [ j ] dp[i][j]dp[i][j]表示以( i , j ) (i, j)(i,j)为右下角的最大无树正方形边长
    • 状态转移:当前位置能扩展的正方形边长受限于上方、左方、左上方三个相邻位置的最小值
  3. 关键步骤

    • 初始化:读取n nn(农场边长)、t tt(果树数量),标记有树的位置g [ x ] [ y ] = 1 g[x][y] = 1g[x][y]=1
    • DP 数组初始化d p [ i ] [ j ] dp[i][j]dp[i][j]初始化为较大值(边界处理),a n s = 0 ans = 0ans=0
    • 递推计算(遍历i ii1 11n nnj jj1 11n nn):
      • g [ i ] [ j ] = 1 g[i][j] = 1g[i][j]=1(有树):d p [ i ] [ j ] = 0 dp[i][j] = 0dp[i][j]=0
      • i = 1 i = 1i=1j = 1 j = 1j=1(边界):d p [ i ] [ j ] = 1 dp[i][j] = 1dp[i][j]=1(无树位置)
      • 否则:状态转移d p [ i ] [ j ] = min ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j − 1 ] ) + 1 dp[i][j] = \min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1dp[i][j]=min(dp[i1][j],dp[i][j1],dp[i1][j1])+1
      • 更新全局答案a n s = max ⁡ ( a n s , d p [ i ] [ j ] ) ans = \max(ans, dp[i][j])ans=max(ans,dp[i][j])
    • 输出答案a n s ansans
  4. 时间/空间复杂度

    • 时间复杂度:O ( n 2 ) O(n^2)O(n2),双层循环遍历整个网格
    • 空间复杂度:O ( n 2 ) O(n^2)O(n2)d p dpdp二维数组和g gg标记数组
  5. 二维 DP 的核心思想

    • 子结构重叠:以( i , j ) (i, j)(i,j)为右下角的正方形,其边长受限于三个方向(上、左、左上)能形成的最小正方形,因为这三个方向必须同时满足无树才能扩展
    • 最小值约束d p [ i ] [ j ] dp[i][j]dp[i][j]取三者最小值加1 11,因为只要任一方向存在树或边界限制,当前正方形就无法突破该限制
    • 边界处理:第一行和第一列的无树位置最大只能形成1 × 1 1 \times 11×1的正方形,作为递推基础
    • 贪心最优性:每个位置记录以它为右下角的最大正方形,全局取最大即得答案
    • 适用于最大正方形/矩形、矩阵覆盖、障碍物规避类问题

【算法标签】

#普及 #线性DP-二维

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=1005;// 最大农场尺寸intn,t,ans;// n:农场边长, t:果树数量, ans:最大正方形牛棚边长intg[N][N];// g[i][j]:标记该位置是否有树(1表示有树,0表示无树)intdp[N][N];// dp[i][j]:以(i,j)为右下角的最大无树正方形边长intmain(){cin>>n>>t;// 读入农场边长和果树数量for(inti=1;i<=t;i++)// 读入每棵果树的位置{intx,y;cin>>x>>y;g[x][y]=1;// 标记该位置有树}// 初始化dp数组为较大值(用于边界处理)memset(dp,0x3f,sizeof(dp));for(inti=1;i<=n;i++)// 外层循环:枚举行for(intj=1;j<=n;j++)// 内层循环:枚举列{if(g[i][j])// 如果当前位置有树{dp[i][j]=0;// 以该位置为右下角的正方形边长为0(不能建牛棚)}elseif(i==1||j==1)// 边界位置(第一行或第一列)dp[i][j]=1;// 边界上无树的位置最大正方形边长为1else{// 状态转移:以(i,j)为右下角的最大正方形边长// 取决于上方、左方、左上方三个位置的最小值加1// 原理:如果这三个方向都能形成边长为k的正方形,则当前可形成边长为k+1的正方形dp[i][j]=min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1;}ans=max(ans,dp[i][j]);// 更新全局最大边长}cout<<ans<<endl;// 输出最大正方形牛棚的边长return0;}

【运行结果】

8 3 2 2 2 6 6 3 5
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 23:44:07

数字孪生为何停在静态展示层次

你打开一个数字孪生项目演示视频&#xff1a;酷炫的园区三维模型&#xff0c;镜头推进&#xff0c;各栋楼上弹出温度、湿度、能耗数据。你心想&#xff1a;这不就是把监控数据放在三维模型上吗&#xff1f;跟我在二维仪表盘上看有什么区别&#xff1f;往下翻&#xff0c;视频结…

作者头像 李华
网站建设 2026/8/13 23:43:29

嵌入式工程师进阶指南:RTOS事件在工程中具体应用

普通的信号量存在两个弊端&#xff1a;一是无法避免优先级翻转问题&#xff0c;二是不具备实现一对多线程发送信号的能力。事件和信号量的设计初衷是一致的就是实现两个线程之间的同步&#xff0c;而事件比信号量更适合在多对多和多对一的场景上使用。现有一个要求如下&#xf…

作者头像 李华
网站建设 2026/8/13 23:43:17

数据安全审计系统架构设计与AI实践

1. 项目概述&#xff1a;数据安全审计的范式革命 去年参与某金融机构数据治理项目时&#xff0c;客户安全团队负责人向我展示过这样一组数据&#xff1a;他们每天需要处理来自网络设备、数据库、业务系统的审计日志超过200GB&#xff0c;但实际能有效分析的不足5%。这并非个例&…

作者头像 李华
网站建设 2026/8/13 23:42:11

SDC约束设计实战:从核心命令到工程避坑指南

1. 项目概述&#xff1a;SDC命令的江湖地位与核心价值 在数字芯片设计的江湖里&#xff0c;SDC&#xff08;Synopsys Design Constraints&#xff09;文件就是整个项目的“宪法”。它不写代码&#xff0c;却定义了芯片的“行为准则”——时钟怎么跑、信号怎么传、路径怎么约束。…

作者头像 李华
网站建设 2026/8/13 23:42:00

Python+Selenium自动化测试入门:从环境搭建到Page Object模式实战

1. 从“手动点点点”到“脚本自己跑”&#xff1a;为什么我们需要自动化测试&#xff1f;如果你是一名测试工程师&#xff0c;或者是一名需要对自己代码负责的开发&#xff0c;那么“自动化测试”这个词你一定不陌生。但很多时候&#xff0c;它就像一个挂在嘴边的“高级”概念&…

作者头像 李华