(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 32 22 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 #include2 #include3using
namespace
std;
4const
int maxn=1e3+10;5
intn,t,ans;
6int
f[maxn][maxn];
7bool
v[maxn][maxn];
8int
main()
15for(int i=1;i<=n;i++)
16for(int j=1;j<=n;j++)
17if(!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\n
",ans);
19return0;
20 }
順便,p1387 最大正方形也可以怎麼做,或者o(n3)暴力可過;
USACO 5 3解題報告
題目翻譯 搜尋,以桶的數量,桶的數量上限,剩餘牛奶量為參量進行搜尋。乙個桶可以使用c 剩餘牛奶量 桶的容量次,分別對使用1 c次該桶的情況進行搜尋 同時,但凡出現桶的容量大於當前答案便進行剪枝。題目翻譯 插入新視窗時,將新視窗的高度置於當前最小 置頂時,將視窗的高度置於當前最小 置底時,將視窗高度置...
USACO巨大牛棚(DP)
農夫約翰想在他的正方形農場中建乙個巨大的正方形牛棚。他不願意在農場中砍伐樹木,因此,他想要找一片平坦的土地,可以讓他不需伐木就可直接在那裡進行牛棚的搭建。為了達到這一目的,我們將他的農場劃分為 n n 個方格區域。給定包含樹木的方格區域的數量,以及這些區域的具體位置。請你計算,他在不砍伐樹木的情況下...
巨大的棋盤
小a站在乙個巨大的棋盤上。這個棋盤可以看成是乙個網格圖。這個網格圖的大小為n m。左上角座標為 1,1 右下角座標為 n,m 這個棋盤很特別,他每行每列都是乙個環。具體來說,當小a站在第一行,他往上走的時候,他會走到第n行,站在第n行往下走會走到第一行。對於第一列和第m列類似。小a在棋盤上可以上下左...