タイトル説明
格子のいくつかは、白色に着色一部格子によって黒染めされたn×n行列、行列が与えられると、白色の矩形の数は、現在のマトリックスに必要とされます
入力形式
最初の行、整数n、矩形のサイズ。
n文字の次のn行、文字「W」または「B」。「W」は、白のセルを表し、「B」はヘイグを表します。
出力フォーマット
正の整数であり、白い矩形の数
サンプル入力と出力
入力#1
4 WWBW BBWB WBWW WBWB
出力#1
15
説明/ヒント
データ、n≤50の30%。
データの100%、n≤150します。
考え
繰り返されることはありません右に見て固定長方形の左下隅を展開するだけでなく、非常に簡単に考えて
各行の先頭に、前行の高さの各列では、便利な統計後に、その後、拡大する権利を確認し、最小の高さが高さに拡張されて取ることができ、その後、I、Jは、左下隅の幅であることを見つけるために、 K-J + 1は、回答後累積の値に矩形番号の高さに等しいです。
コード
#include <cmath> の#include <cstdioを> する#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> 名前空間STDを使用して、 const int型N = 200; チャーマップ[N] [N]。 N INT、ANS、CNT [N]。 INTメイン(){ scanf関数( "%のD"、&N); (I = 1をint型I ++; iが<= n)のため のために(INT J = 1; J <= N; J ++) CIN >>地図[I] [J]。 以下のために(INT i = 1; iが<= N; iは++){ ための(int型J = 1; J <= N; J ++) IF(マップ[I] [J] == 'B') CNT [J] = 0 ; 他の CNT [J] ++; 用(INTのJ = 1; J <= nであり、j ++){ int型フラグ= CNT [J]。 用(int型K = J、K <= N; ++ K){ 場合(!CNT [K]) 破ります。 } ANS + =フラグ。 } } のprintf( "%d個の\ n"、ANS)。 0を返します。 }