給出1個m*n的矩陣m1,裡面的元素只有0或1,找出m1的乙個子矩陣m2,m2中的元素只有1,並且m2的面積是最大的。輸出m2的面積。
input
第1行:2個數m,n中間用空格分隔(2 <= m,n <= 100)output第2 - n + 1行:每行m個數,中間用空格分隔,均為0或1。
輸出最大全是1的子矩陣的面積。input 示例
3 3output 示例1 1 0
1 1 1
0 1 1
4這個題目n=100時可以根據最小子矩陣和求o(n^3),但是當n範圍為1000時,就要求降乙個數量級了。
這裡我們可以一行一行的求。
比如第一行 1 1 0 1 1 1 0 1
那麼我們求和b=
比如第二行為1 1 0 0 0 0 1 1
那麼我們繼續求和b=......
也就是說:
if(map[i][k])
b[k] ++;
else
b[k] = 0;
這樣得到了了乙個直方圖,不知道大家有沒有求過最大直方圖面積的問題
就是不同高度的直方圖,求這個直方圖最大的矩形面積,如何去求?
比如直方圖高度為 1 2 3 2,那麼最大面積是?
當以第乙個為基準的時候高度為1,後面的大於都可以組成矩形,所以面積為4.當以第二個為基準,那麼只有後三個可以,面積為6.同理。。。。最大面積為6.
這裡也是一樣,當求得了第一行到當前行的高度後,可以求出目前的最大面積。
我們設立兩個陣列l,r分別表示以b[j]為基準時候的左右邊界,那麼一b[j]為基準的面積就變成了b[j]*(r[j]-l[j]+1),然後列舉出最大的即可。
對於l,r,我們可以通過下面計算方法獲得:
for (int j = 1; j <= n; ++ j)
}for (int j = n; j >= 1; -- j)
}
最後可以求最大值:
for (int j = 1; j <= n; ++ j)
}
#include #include #include using namespace std;
const int maxn = 510;
int map[maxn][maxn];
int b[maxn],l[maxn],r[maxn];
int m,n;
int main()
} for (int j = 0; j <= n+1; ++ j)
for (int i = 1; i <= m; ++ i)
/*for (int j = 1; j <= n; ++ j)
}*/for (int j = 1; j <= n; ++ j)
}for (int j = n; j >= 1; -- j)
}for (int j = 1; j <= n; ++ j)
}} cout << max << endl;
} return 0;
}
最大全1子矩陣
題目描述 在乙個m n的矩陣中,所有的元素只有0和1,從這個矩陣中找出乙個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。輸入 輸入可能包含多個測試樣例。對於每個測試案例,輸入的第一行是兩個整數m n 1 m n 1000 代表將要輸入的矩陣的大小。矩陣共有m行,每行有n個整數,分別是0或1,相...
poj 3494 dp 最大全1子矩陣
題意 給定乙個n m大小的0 1矩陣,求所有元素都為1的最大子矩陣。思路 把2維轉化為一維 這一點有點像poj1050求最大子矩陣 列舉每一行。dp i j 的值表示第 i,j 個位置作為底,它上面的 包括自己 的連續1的個數。然後通過棧的單調性求每行的 最大值 每行的情況如同poj2559 可以用...
COCI NEO 單調棧求最大全1子矩陣
應該能進 現在有乙個n m的矩陣,定義乙個矩陣 r 2,c 2 是cool的當 a i j a i 1 j 1 a i j 1 a i 1 j 定義乙個矩陣是非常cool的,當所有它的子矩陣 r 2,c 2 是cool的。問你這個矩陣中非常cool 的矩陣最多包含的點的數量是多少。這個題意我搞了好久...