題意:
給你乙個n*m的矩陣《每個格仔不是'f'就是'r'>,讓你找乙個最大的'f'矩陣,輸出他的面積*3。
思路:比較經典的題目了,現在想起來比較好想,以前的話想著很費勁,最早先用瓶頸法在杭電上過了乙個資料範圍比較小的,今天的這個目測瓶頸法過不去,瓶頸法的時間複雜度是o(n^3)的,今天的這個我們可以用另外乙個也是比較經典的乙個方法,時間複雜度是o(n^2),思路是我們可以列舉每個矩形向上延伸的最大距離,然後把這個最大距離(豎線)像左的最大平移距離和向右的最大平移距離求出來,高h[i][j],左最大距離l[i][j] ,右最大平移距離r[i][j],然後當前答案是 now = (l[i][j] + r[i][j] - 1) * h[i][j].這個很容易理解,每乙個最大的子舉行一定是某乙個點的最長向上距離*左右活動範圍得來的。然後對於更新的時候是這樣的:
如果當前是'r'那麼h[i][j] = 0 ,否則h[i][j] = h[i-1][j] + 1
如果當前是'r'那麼l[i][j] = 0 ,否則如果當前的上乙個是'r'或者當前是第一行,那麼l[i][j] = ls ,否則l[i][j] = min(ls ,l[i-1][j]);ls 是當前行前面的最大延續長度,更新r[i][j]的時候類似,具體細節看**。
#include
#include
#define n 1000 + 5
int map[n][n];
int h[n][n] ,l[n][n] ,r[n][n];
int minn(int x ,int y)
int maxx(int x ,int y)
int main()
int ans = 0;
memset(h ,0 ,sizeof(h));
memset(l ,0 ,sizeof(l));
memset(r ,0 ,sizeof(r));
for(i = 1 ;i <= n ;i ++)
rs = 0;
for(j = m ;j >= 1 ;j --)}}
printf("%d\n" ,ans * 3);
}return 0;
}
列舉(最大子矩陣,LA 3029)
感覺列舉的問題想要優化就一定要一邊列舉一邊維護些東西,或者要預處理之類的。記得以前做了一道題 唯一的不同是求周長最長。做的時候參考了這道題,也是列舉右下角,然後用單調棧維護左上角。在那題中隨著j的增大,並不會影響單調棧內元素的單調性。然而在這題裡,隨著j的增大,越後面的元素增長得越快,因此後面的小的...
LA3029 矩陣中求子矩陣最大問題
la3029 題意給你乙個矩陣,每個單元格要麼為空,要麼為滿,求全是空的最大子矩陣的格仔數 3.最樸素的演算法是列舉所有的子矩陣的左上角的點和右下角的點,這樣就能確定乙個矩形,然後再遍歷這個矩陣,看矩陣是否全是空。複雜度大概是o m 2 n 2 通過掃瞄法,每次維護left i j right i ...
最大子矩陣
描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子矩陣的大小是15。輸入輸入是乙個n n的矩陣。輸入的第...