USACO 5.3 Big Barn

本文介绍了一种利用动态规划(DP)方法解决特定条件下的最大正方形问题。通过定义状态转移方程和初始化边界条件,作者展示了如何高效地求解此类问题。文章详细阐述了DP数组的构建过程,以及如何从最终结果中提取最大正方形的边长。

用DP写的,题目限定了为最大正方形,所以用dp写起来非常顺手~~

dp[i][j]表示以点(i,j)为右下角的正方形的最大边长。

dp[i][j] = max(dp[i][j], min(dp[i-1][j-1]+1,sx, sy[j]) )~~开代码吧,很鲜明~

dp[i][j] == -1表示不存在合法正方形

/*
ID: zlqest11
LANG: C++
TASK: bigbrn
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1002;
int n, m, dp[N][N];
int sx, sy[N];

int main()
{
int ans = 0, x, y;
freopen("bigbrn.in", "r", stdin);
freopen("bigbrn.out", "w", stdout);
scanf("%d%d", &n, &m);
memset(dp, 0, sizeof(dp));
for(int i = 0; i < m; i++){
scanf("%d%d", &x, &y);
dp[x][y] = -1;
}
memset(sy, 0, sizeof(sy));
for(int i = 1; i <= n; i++){
sx = 0;
for(int j = 1; j <= n; j++){
if(dp[i][j] == -1){
sx = sy[j] = 0;
continue;
}
else{
sx++, sy[j]++;
dp[i][j] = 1;
dp[i][j] = max(dp[i][j], min(dp[i-1][j-1]+1, min(sx, sy[j])));
ans = max(ans, dp[i][j]);
}
}
}
printf("%d\n", ans);
return 0;
}



转载于:https://www.cnblogs.com/zxndgv/archive/2012/02/15/2352265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值