農民約翰在一片邊長是n (2 <= n <= 250)英里的正方形牧場上放牧他的奶牛。(因為一些原因,他的奶牛只在正方形的牧場上吃草。)遺憾的是,他的奶牛已經毀壞一些土地。( 一些1平方英里的正方形)
農民約翰需要統計那些可以放牧奶牛的正方形牧場(至少是2x2的,在這些較大的正方形中沒有乙個點是被破壞的,也就是說,所有的點都是「1」)。
你的工作要在被**的資料組裡面統計所有不同的正方形放牧區域(>=2x2)的個數。當然,放牧區域可能是重疊。
輸入格式:
第 1 行:n,牧區的邊長。
第 2 到 n+1 行:n個沒有空格分開的字元。0 表示 "那乙個區段被毀壞了";1 表示 " 準備好被吃"。
輸出格式:
輸出那些存在的正方形的邊長和個數,一種一行。
這題純dp。
f[i][j]為以
(i,j)
為右下角的最大正方形的邊長。
當f[i][j]=a時,易得
f[i][j-1]>=a+1 && f[i-1][j]>=a+1 && f[i-1][j-1]>=a+1
, 如圖:
因為要找最大的正方形,所以可得f[i][j]=min(f[i][j-1],f[i-1][j],f[i-1][j-1])+1
**如下:
#include #define min(x,y) ((x)
#define max(x,y) ((x)>(y)?(x):(y))
char cnt;
int n,ans[251],f[251][251],maxn;
int main()
f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1;//動態轉移方程
ans[f[i][j]]++;//記錄數字
maxn=max(maxn,f[i][j]);//計錄最大的正方形
} }for(int i=maxn;i>=2;i--)ans[i-1]+=ans[i];//打大正方形數量加到小正方形上
for(int i=2;i<=maxn;i++)std::cout << i << ' ' << ans[i] << '\n';
return 0;
}
Luogu P2733 家的範圍
luogu p2733 家的範圍 初看這題沒有思路,參考了一下題解的思路,於是用了字首和。ans表示以 i,j 為右下角的矩形區域內邊長為k的正方形是否存在,以此記錄整個矩陣內邊長為k的正方形的個數。用d i j 預處理出以 i,j 為右下角,0,0 為左上角的矩形區域內1的個數。僅當該點為原值1,...
洛谷 2733 家的範圍
在乙個邊長為n的正方形矩陣中,尋找邊長為2 n的全1矩陣的個數按邊長找,每次的g i j bool 表示當前邊長下起點為i,j的矩陣是否符合要求 若g i j g i 1 j g i j 1 g i 1 j 1 均為true,則新的g i j 也為true,否則為false 我自己想出來的o n 3...
洛谷 2733 家的範圍
農民約翰在一片邊長是n 2 n 250 英里的正方形牧場上放牧他的奶牛。因為一些原因,他的奶牛只在正方形的牧場上吃草。遺憾的是,他的奶牛已經毀壞一些土地。一些1平方英里的正方形 農民約翰需要統計那些可以放牧奶牛的正方形牧場 至少是2x2的,在這些較大的正方形中沒有乙個點是被破壞的,也就是說,所有的點...