每日一題之 hiho222周 Big Plus

2021-08-28 19:24:35 字數 1810 閱讀 5337

描述

given an nxn 01 matrix, find the biggest plus (+) consisting of 1s in the matrix.

size 1 plus   size 2 plus   size 3 plus  size 4 plus

1 1 1 1

111 1 1 1

1 11111 1 1

1 1111111 1

1 1 111111111

1 1

1 1

11

輸入

the first line contains an integer n. (1 <= n <= 500)

then follow an nxn 01 matrix.

輸出the size of the biggest plus in the matrix.

樣例輸入

500100

00100

11111

00110

10101

樣例輸出

2思路:

解決本題需要使用乙個經典的優化技巧:字首和。

對於矩陣中每乙個位置(i, j),我們可以計算up[i][j], down[i][j], left[i][j], right[i][j],依次是從(i, j)開始,向上下左右四個方向最多能延伸出多少連續的1。

如果a[i][j]=0,則up[i][j]=down[i][j]=left[i][j]=right[i][j]=0利用類似字首和的技巧,否則有遞推式:

up[i][j] = up[i - 1][j] + 1

down[i][j] = down[i + 1][j] + 1

left[i][j] = left[i][j - 1] + 1

right[i][j] = right[i][j + 1] + 1

我們可以先從上到下,從左到右計算出up[i][j]和left[i][j],再反向計算出down[i][j]和right[i][j]。時間複雜度是o(n^2)。

最後對於每個(i, j),up[i][j], down[i][j], left[i][j], right[i][j]的最小值就是以(i, j)為中心的plus的size。所有(i, j)的最大值就是答案。

#include #include #include #include using namespace std;

const int maxn = 500+7;

int up[maxn][maxn];

int down[maxn][maxn];

int left[maxn][maxn];

int right[maxn][maxn];

int a[maxn][maxn];

void solve(int n)

} }for (int i = n-1; i >= 1; --i)

} }int res = 0;

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

} cout << res-1 << endl;

}int main ()

} }solve(n);

return 0;

}

每日一題之 hiho232周 拆字遊戲

給出乙個01矩陣,1佔據的部分即為需要拆的字,如果兩個1分享一條邊,那麼它們連通。連通具有傳遞性,即如果a b連通,b c連通,則a c連通。連通的一系列1被看做可以拆出的一塊,現在小kui需要輸出這些拆出的塊 用乙個01矩陣表示,並且要求矩陣的大小盡可能的小 為了確保輸出的順序盡可能的和書寫的順序...

每日一題之 hiho1744 hohahola

描述 有一種叫作hohahola的飲料,售價是x元一瓶。小hi非常喜歡這種飲料,但是他現在身無分文。不過小hi有n張優惠券,買hohahola時每瓶最多使用一張優惠券,可以使該瓶 減少y元。y x 同時優惠券可以 小hi每 一張優惠券可以獲得z元。請你幫小hi計算通過 若干優惠券,他最多可以買多少瓶...

每日一題之 hiho1304 24點

週末,小hi和小ho都在家待著。在收拾完房間時,小ho偶然發現了一副撲克,於是兩人考慮用這副撲克來打發時間。小ho 玩點什麼好呢?小hi 兩個人啊,不如來玩24點怎麼樣,不靠運氣就靠實力的遊戲。小ho 好啊,好啊。經過若干局遊戲之後 小ho 小hi,你說如果要寫個程式來玩24點會不會很複雜啊?小hi...