描述
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...