:吊りライン方式を初めて目「の部分行列の最大の問題を解決するための素晴らしいアイデアの使用について」
この質問のために、バリアポイントが同じポイントに現在の色で、他はうまく行うためのテンプレートとしてやりました。
書式#include <iostreamの> 書式#include <stdio.hに> する#include <stdlib.h>に含ま する#include < 文字列の.h> 使用して 名前空間はstdを、 int型 N、M、BD [ 2010 ] [ 2010 ]、L [ 2010 ] [ 2010 ]、R [ 2010 ] [ 2010 ]、HT [ 2010 ] [ 2010 ]。 INT メイン() { scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 I = 1 iが++; iが<= N ) のため(のInt J = 1。 ; Jは<= M; J ++ ) { scanfの(" %D "、&BD [I] [J]); L [I] [J] = J; R&LT [I] [J] = J ; HT [I] [J] = 1 ; // サスペンションワイヤは、初期値をijをする } ため(INT I = 1 ; I <= N; I ++ ) のための(INT J = 2、J <= M; J ++ ) IF(!BD [I] [J] BD = [I]、[J- 1 ]) L [I] [J] = L [I]、[J- 1 ]; // サスペンションワイヤが左IJを延長することができる ため(int型 = Iを1 ; iは<N =; I ++ ) のための(INT J = M- 1 ; J> = 1 ; j-- ) もし!(BD [I] [J] = BD [I] [jは+ 1 ] ) R [I] [J] = R [I] [J + 1 ]。 // 悬线IJ向右延伸 するための(int型 I = 2、I ++; iが<= N ) のための(INT J = 1 ; J <= M; ++ J ) 場合!(BD [I] [J] = BD [I - 1 ] [J]) { HT [I] [J]HT =〔I- 1〕〔J〕+ 1 ; // 上向きのij延びるサスペンションワイヤ L [I] [J] = MAX(L [I]、[J]を、L [I- 1 ] [J]); / / 懸濁ライン間隔IJ収縮左 R&LTを[I] [J] =分(R&LT [I] [J]は、R [I- 1 ] [J]); // 右のセクションを縮小 } INT ANS1 = 0、ANS2 = 0 ; のための(INT I = 1 ; I <= N; I ++ ) のための(INT J = 1。 ; J <= M; J ++ ) { int型 A = R&LT [I] [J] -1- [I] [J] + 。1、B = HT [I]、[J]; //ワイヤはサスペンションワイヤの周りに延びるサスペンションの矩形の幅に対応ijは距離が、高ijは上方の距離延びijを ANS1 = maxに(ANS1、分(A、B)*分(A、B)); // 四角形の対応する領域 ANS2 =最大(ANS2、*のB); // 矩形領域 } のprintf(" %D \ D N-%\ N- " 、ANS1、ANS2); 戻り 0 ; }