例題1:usaco big barn 巨大的牛棚農夫約翰想要在他的正方形農場上建造一座正方形大牛棚。他討厭在他的農場中砍樹,想找乙個能夠讓他在空曠無樹的地方修建牛棚的地方。我們假定,他的農場劃分成 n x n 的方格。輸入資料中包括有樹的方格的列表。你的任務是計算並輸出,在他的農場中,不需要砍樹卻能夠修建的最大正方形牛棚。牛棚的邊必須和水平軸或者垂直軸平行。
考慮下面的方格,它表示農夫約翰的農場,『.'表示沒有樹的方格,『#'表示有樹的方格
最大的牛棚是 5 x 5 的,可以建造在方格右下角的兩個位置其中乙個。
line 1: 兩個整數: n (1 <= n <= 1000),農場的大小,和 t (1 <= t <= 10,000)有樹的方格的數量
lines 2..t+1: 兩個整數(1 <= 整數 <= n), 有樹格仔的橫縱座標
輸出檔案只由一行組成,約翰的牛棚的最大邊長。
8 3
2 22 6
6 35
如圖,此題不難看出結果是5,但是dp方程是什麼呢?
這是個2維的圖形,很顯然一維的狀態是不夠的,設f[i][j]表示以i行j列為右下角(左上角)的最大正方形邊長。
這個最大正方形與前邊3個有關。
f[i][j]=min(f[i][j-1],f[i-1][j],f[i-1][j-1])+1;
**如下:
#includeint f[1001][1001];
int main()
for(i=1;i<=n;i++)
if(f[i-1][j-1]+1ans)
ans=f[i][j];
} }printf("%d",ans);
}
例2:home on the range 家的範圍農民約翰在一片邊長是n (2 <= n <= 250)英里的正方形牧場上放牧他的奶牛.(因為一些原因,他的奶牛只在正方形的牧場上吃草.)
遺憾的是,他的奶牛已經毀壞一些土地.( 一些1 平方英里的正方形)
農民約翰需要統計那些可以放牧奶牛的正方形牧場(至少是2x2 的,在這些較大的正方形中沒有小於1x1 的部分被分割毀壞).
你的工作要在被**的資料組裡面統計所有不同的正方形放牧區域(>2x2)的個數.
當然,放牧區域可能是重疊.
第 1 行: n,牧區的邊長.
第 2 到n+1 行: n 個沒有空格分開的字元.
0 表示 "那乙個區段被毀壞了";1 表示 " 準備好被吃".
輸出那些存在的正方形的大小和個數,一種一行.6
101111
001111
111111
001111 1
01101
111001
2 10
3 44 1
此題與上題有一樣了,不解釋。
#includeint a[251][251],f[251][251],ans[251];
int main()
}for(i=1;i<=251;i++)
}
例3:最大正方形
背景描述:忙完了學校的事,v神終於可以做他的「正事」:陪女朋友散步。一天,他和女朋友走著走著,不知不覺就來到了乙個千里無菸的地方。v神正要往回走,如發現了一塊牌子,牌子上有有一行小字和一張圖,小字說道:「找到圖上最大的交錯正方形之後和我聯絡,這塊地就是你的了。」在房價瘋長的年代,v神當然不願錯過這個機會,於是開始找了起來……以v神的能力當然找不出來了,你能幫v神找出來嗎?
題目描述:
圖上有乙個矩陣,由
n*m個格仔組成,這些格仔由兩種顏色構成,黑色和白色。請找到面積最大的且內部是黑白交錯(即兩個相連的正方形顏色不能相同)的正方形。
樣例解釋:
(1,1)到(2,2)這個正方形是滿足條件的,它的邊長是2
資料範圍約定:
對於30%的資料,n <= 20
對於60%的資料,n <=300
對於100%的資料,n <= 1500
第一行兩個整數n和m,分別表示行數和列數。接下來有n行,每行m個數,0或1分別表示這個格仔是黑色或白色。
僅有一行,表示滿足條件最大正方形的 邊長。
3 30 1 0
1 0 0
1 1 1
2 這是一道奇偶染色問題,需要考慮兩種,把0變成1,剩下留給讀者思考。
#includeint a[1501][1501],f[1501][1501],f2[1501][1501];
int main()
}for(i=1;i<=n;i++)
else}}
for(i=1;i<=n;i++)
else if(f2[i-1][j]<=f2[i-1][j-1]&&f2[i-1][j]<=f2[i][j-1])
else if(f2[i][j-1]<=f2[i-1][j-1]&&f2[i][j-1]<=f2[i-1][j])}}
}for(i=1;i<=n;i++)
}
for(i=1;i<=n;i++)
else if(f2[i-1][j]<=f2[i-1][j-1]&&f2[i-1][j]<=f2[i][j-1])
else if(f2[i][j-1]<=f2[i-1][j-1]&&f2[i][j-1]<=f2[i-1][j])
}else}}
for(i=1;i<=n;i++)
}if(ans>ans2)
printf("%d",ans);
else
printf("%d",ans2);
}
最大全1正方形(簡單dp)
描述 飛哥最近 得到 了一大塊 n m 的土地 他想在這塊土地 上建乙個正方 形的農場 但是 這塊土 地有些地方 被大石頭 佔著,無法 使用 於是 飛哥想來問你 在這塊土地 上能建成的農場 的最大 邊 長為多少 輸入第乙個數t表示陣列組數 每組 資料 一開 始有兩個 整數 n和 m,表示 土地 的長...
最大正方形子矩陣
題目描述 在乙個01矩陣中,包含有很多的正方形子矩陣,現在要求出這個01矩陣中,最大的正方形子矩陣,使得這個正方形子矩陣中的某一條對角線上的值全是1,其餘的全是0。輸入描述 第一行有兩個整數n和m 1 n,m 1000 接下來的n行,每行有m個0或1的數字。每兩個數字之間用空格隔開。輸出描述 輸出乙...
最大正方形
題目鏈結 在乙個n m的只包含0和1的矩陣裡找出乙個不包含0的最大正方形,輸出邊長。輸入格式 輸入檔案第一行為兩個整數n,m 1 n,m 100 接下來n行,每行m個數字,用空格隔開,0或1.輸出格式 乙個整數,最大正方形的邊長 輸入樣例 1 複製 4 4 0 1 1 1 1 1 1 0 0 1 1...