luoguP2733 家的範圍

2021-08-11 07:45:49 字數 1229 閱讀 7911

農民約翰在一片邊長是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的,在這些較大的正方形中沒有乙個點是被破壞的,也就是說,所有的點...