羅区P2701 [USACO5.3]偉大ブルペンビッグ納屋
説明
ファーマージョンは彼の正方形の農場のブルペンで大きな広場を建設したいと考えています。彼は、彼が開いた樹木のない地域でブルペンを構築することを可能にする場所を探して、彼の農場に樹木を伐採憎みました。私たちは彼の農場は、N×N個の正方形に分割されていることを前提としています。入力されたデータは、ツリーの正方形のリストを含んでいます。あなたの仕事は彼の農場で、計算して出力することが、最大の広場ブルペンを構築するために木を伐採必要とすることはできません。牛舎エッジは平行で水平または垂直軸でなければなりません。
例
、ファーマージョンのファームを表し、次のグリッドを、考えてみましょう「」正方形は何の木を表していない、「#」は木の正方形を示し、
1 2 3 4 5 6 7 8
1。。。。。。。。
2。#。。。#。。
3。。。。。。。。
4。。。。。。。。
5。。。。。。。。
6。。#。。。。。
7 。。。。。。。。
8。。。。。。。。
ブルペンでは、ボックスの2右下隅の一つ構築することができ、最大5×5です。
入力
数N(1 <= N <= 1000)、ファームのサイズ、及びT(1 <= T <= 10,000)木の市松:二つの整数:1つのライン
ライン2..T + 1の2つの整数(1 <=整数<= N)、ツリーグリッドの水平および垂直座標であります
出力
- 唯一のシングルライン、ジョンのブルペンの最大辺の長さ。
サンプル入力
8 3 2 2 2 6 6 3
サンプル出力
5
ソリューション:
- DP。
- 提供DP(i、j)はである:最長辺の長さが正方形する場合(i、j)は右下の正方形です。
- 中心として集合L(i、j)は(i、j)はであり、左側は、拡張ポイントの数にまで拡大します。
- セットポイント数r(i、j)が、上方に拡張するまで拡張する、中心として(i、j)はです。
- LとRは、第一再帰アレイによって計算されることができます。カウントする方法をDPので、↓のように
- DP(i、j)は=分{DP(I - 1、J - 1)+ 1、L(I、J)+ R(i、j)は}
- 想像している場合、DP(I - 1、J - 1)で最小、そうリットル、それよりも確かに大きなR。次に、格子の範囲にこの行DPにおける線I、及びJ(I - - 1、J 1)は確かに有効である; Lは、それが大きい場合よりも、次にDP、R&LT最小である場合。だから、フレーミング広場に確かに正当なものです。
- ねえ、これは言葉で表現するのは本当に難しいですが、強く、個々の脳は、グラフィックスが見えるシミュレートすることをお勧めします!
#include <iostream>
#include <cstdio>
#define N 1005
using namespace std;
int n, m, ans;
int a[N][N], dp[N][N], l[N][N], r[N][N];
int main()
{
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
a[x][y] = 1;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(a[i][j]) l[i][j] = r[i][j] = 0;
else l[i][j] = l[i][j - 1] + 1, r[i][j] = r[i - 1][j] + 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
dp[i][j] = min(dp[i - 1][j - 1] + 1, min(l[i][j], r[i][j]));
ans = max(ans, dp[i][j]);
}
cout << ans;
return 0;
}