すべての1の最大の部分行列
制限時間: 5000MS | メモリの制限: 131072K | |
合計の提出: 9286 | 受け入れ: 3336 | |
ケース制限時間: 2000ミリ秒 |
説明
与えられたM行列のnは全て1の最も大きいのすべての部分行列の(0,1) -マトリックス、?することで、最大我々は、部分行列は、ほとんどの要素を持っていることを意味します。
入力
入力は複数のテストケースが含まれています。各テストケースは、で始まり、M及びN(1≤ M、Nライン2000以下)。次いで、上の行優先順に(0,1) -マトリックスの要素来るm個の行と、各N個の番号。EOFが満たされたら、入力が終了します。
出力
各テストケースは、すべての1の最大部分行列の要素の数を含む出力1ライン分。与えられた行列がすべて0の場合には、出力0。
サンプル入力
2 2 0 0 0 0 4 4 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0
サンプル出力
0 4
ソース
POJの創設者月例コンテスト- 2008年1月31日
、xfxyjwf
問題解決のアイデアを:最大変換問題(https://www.cnblogs.com/qq-1585047819/p/11347741.html)のための長方形の下の各行の列挙の動作を変更する、単調には2つのキューを維持します
1の#include <iostreamの> 2の#include <CStringの> 3の#include <cstdioを> 4の#include <アルゴリズム> 5の#include <地図> 6 使って 名前空間STDを、 7 8 int型N、M、MAXX。 9 のconst int型 N = 2005 。 10 int型DP [N]。 11 INTのSTA [N]、トップ。 12 のint MA1 [N]、MA2 [N]。 13 14インラインint型リード(){ 15 、INT X = 0、F = 1 。 16 チャー CH = GETCHAR()。 17 一方(CH < ' 0 ' || CH> ' 9 ' ){ 18 であれば(CH == ' - ' ) 19 F = - 1 。 20 CH = GETCHAR()。 21 } 22 ながら、(CH> = ' 0 ' && CH <= ' 9 ' ){ 23 、X =(X << 1)+(X << 3)+(CH ^ 48 )。 getchar関数(); 25 } 26 リターンのx *のF。 27 } 28 29 INT メイン(){ 30 ながら(CIN >> N >> M){ 31 のmemset(DP、0、はsizeof (DP))。 32 のmemset(STA、0、はsizeof (STA))。 33 トップ= 0 ; MAXX = 0 。 34 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 35 のために(INT J = 1、D、J <= Mであり、j ++ ){ 36 D = 読み取ります()。 37 DP [j]は、Dの== = 0?0:++ DP [J]。 38 } 39 のmemset(STA、0、はsizeof (STA))。 40 トップ= 0 。 41 のための(int型 J = 1 ; J <= Mであり、j ++ ){ 42 のintフラグ= 0 。 43 一方(DP [STA [トップ]> = DP [J] &&トップ)トップ- 、フラグ= 1 。 44 であれば(フラグ==0)MA1 [J] = J- 1 。 45 他の MA1 [J] =トップ== 0?0 :STA [トップ]。 46台の STA [++トップ] = J。 47 } 48 のmemset(STA、0、はsizeof (STA))。 49 トップ= 0 ; 50 のために(INT ; J> = J = M 1 ; j-- ){ 51 のintフラグ= 0 。 52 一方(DP [STA [トップ]> = DP [J] &&トップ)トップ- 、フラグ= 1 。 53 もし(フラグ== 0)MA2 [J] = J + 1 。 54 他 MA2 [J] =トップ== 0?M + 1 :STA [トップ]。 55台の STA [++トップ] = J。 56 } 57 のために(INT J = 1 ; J <= Mであり、j ++ ){ 58 =最大MAXX(MAXX(MA2 [J] -ma1 [J] - 1)* DP [J])。 59 } 60 } 61 COUT << MAXX << ENDL。 62 } 63 }