洛谷 P2733 家的範圍 二維DP

2021-08-18 01:12:16 字數 1158 閱讀 8487

農民約翰在一片邊長是n (2 <= n <= 250)英里的正方形牧場上放牧他的奶牛。(因為一些原因,他的奶牛只在正方形的牧場上吃草。)遺憾的是,他的奶牛已經毀壞一些土地。( 一些1平方英里的正方形)

農民約翰需要統計那些可以放牧奶牛的正方形牧場(至少是2x2的,在這些較大的正方形中沒有乙個點是被破壞的,也就是說,所有的點都是「1」)。

你的工作要在被**的資料組裡面統計所有不同的正方形放牧區域(>=2x2)的個數。當然,放牧區域可能是重疊。

輸入格式:

第 1 行:n,牧區的邊長。

第 2 到 n+1 行:n個沒有空格分開的字元。0 表示 "那乙個區段被毀壞了";1 表示 " 準備好被吃"。

輸出格式:

輸出那些存在的正方形的邊長和個數,一種一行。

解答:這道題一開始的想法是分別統計各種不同邊長的正方形的個數,這樣找狀態轉移就非常難找。看了別人的思路,可以統計以某個點[i,j]為右下端點的最大正方形邊長,那麼每當統計出這樣的乙個最大正方形邊長大於2的端點,就可以令統計結果中邊長為2...j的正方形的個數都加一。而這樣做的好處就是,這樣設定狀態非常好找狀態轉移方程:當(i,j)點為1時,f[i][j] = min(f[i-1][j],f[i][j-1],f[i-1][j-1])+1。可能乍一看覺得這個方程好像不太對,怎麼能只通過點(i,j)的值來決定狀態轉移呢,好像第i行的點和第j列的點都應該考慮才對?萬一(i,j)左邊某個點或上邊某個點是0怎麼辦?那就要注意狀態轉移取的是三個資料中的

最小值,也就是說得到的是同時滿足當前點左上方的點,左邊的點,上邊的點的最大正方形邊長,假如得到的是2,那麼就意味著當前點左邊的點有乙個2x2的正方形,上邊、左上方的點都是如此,這三個點的2x2的正方形和當前點就共同構成了乙個3x3的正方形,因此這個狀態轉移是正確的。

#include const int maxn = 255;

int data[maxn][maxn];

int dp[maxn][maxn];

int res[maxn];

int min(int a , int b)

int main()

} for (int i = 1 ; i <= n ; i ++)}}

} }for (int i = 2; i <= n ; i ++) }

return 0;

}

洛谷 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的,在這些較大的正方形中沒有乙個點是被破壞的,也就是說,所有的點...

簡單二維dp 洛谷P1855 榨取kkksc03

p1855 榨取kkksc03 題目描述 洛谷2的團隊功能是其他任何oj和工具難以達到的。借助洛谷強大的伺服器資源,任何學校都可以在洛谷上零成本的搭建oj並高效率的完成訓練計畫。為什麼說是搭建oj呢?為什麼高效呢?因為,你可以上傳私有題目,團隊外別人是無法看到的。我們還能幫你們評測!你可以建立作業,...