すべて1の(モノトーンスタック)の最大の部分行列

すべての1の最大の部分行列
制限時間: 5000MS   メモリの制限: 131072K
合計の提出: 9286   受け入れ: 3336
ケース制限時間: 2000ミリ秒

説明

与えられたM行列のnは全て1の最も大きいのすべての部分行列の(0,1) -マトリックス、?することで、最大我々は、部分行列は、ほとんどの要素を持っていることを意味します。

入力

入力は複数のテストケースが含まれています。各テストケースは、で始まり、M及びN(1≤ MNライン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

ソース

 
問題解決のアイデアを:最大変換問題(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の== = 00:++ 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] =トップ== 00 :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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11348760.html