히스토그램 && 51nod 1,158 서브 매트릭스 HDU -1506 최대 사각형은 모두도 1에서, 최대 (모노톤 스택)이다

단조로운 스택과 큐 설명 : 포털

HDU 질문 -1506 의미 :

당신에게 사각형의 일부 높이를 제공하는 것입니다, 그래서 당신은 사각형 영역이 사각형 최대로 구성된 것을 계산

상기 한 바와 같이 피사체가 증분 주어진다면, 모든 그것 욕심를 해결하기 위해 사용될 수있다

왼쪽에서 오른쪽으로 최종 높이와 직사각형의 각각의 높이에서 그 최대 값에서 선택하도록

 

하지만이 증가하지 않는 경우, 중간 낮은 것, 그래서 욕심은 버려야 이상은 전체 높이 전에 취할 수있는 정책을 적용하기를 원하지만, 심지어 그 전에 그들이 최종 답변을 위해 자신의 높이를 실현되지 않을 수 있습니다 던져 무엇을 결정하기 위해 그래서 우리는 구조에 순서를 증가하고, 당신은 그것을 유지하기 위해 스택을 사용할 수 있습니다

 

코드 :

1 #INCLUDE <STDIO.H>
 2 #INCLUDE < 문자열 .H>
 3 #INCLUDE <iostream>
 4 #INCLUDE <큐>
 5 #INCLUDE <알고리즘>
 6 #INCLUDE <벡터>
 7 #INCLUDE <적층>
 8  사용  스페이스 성병 ;
9  CONST의  INT의 maxn = 100,080 ;
10  INT의 N, 높이 [maxn, 폭 [maxn, 스택 [maxn, 상위 = 0 ;
11   작업 ()
 12  {
 13       길이 의 ANS = 0 ;
(14)     위한 ( int로 난 = 1 ; i가 <= N + 1 ] + I)
 15      {
 16 일          경우 (높이 [I]> 스택 [맨])
 17          {
 18              스택 [++ 가기 = 높이 [I];
(19)              의 폭 [위쪽] = 1 ;
20          }
 21          
22          {
 23              INT widthsum = 0 ;
24 일              동안 (스택 [맨]> 높이 [I])
 25              {
 26                  widthsum + = 폭 [맨];
27                  ANS = 최대 (ANS (  길이 ) * widthsum 스택 [맨]);
28                  top-- ;
29              }
 30              스택 [++ 가기 = 높이 [I];
(31)              의 폭 [맨] widthsum = + 1 ;
32          }
 33      }
 34      리턴 ANS;
35  }
 36  INT 의 main ()
 37  {
 38      동안 (~는 scanf ( " %의 D ' , N))
 39      {
 40          하다면(! n)도 휴식 ;
(41)          에 대한이 ( int로 I = 1 ; i가 <= N; ++ I)
 (42)              는 scanf ( " %의 D " , 높이 [I]);
(43)          의 높이 [N + 1 ] = 0 ;
44            ANS = 일 ();
45          의 printf ( " % LLD \ 없음 " , ANS);
46      }
 47      반환  0 ;
48 }
코드보기

 

포털 : 51nod 1158

질문 51nod 1158 의미 :

입력에게 제공하는 직사각형 행 n은 1 또는 0으로 구성되어 열 m은, 사용자가 최대 행 채워진 사각형에서 찾아내는

 

해결 방법 :

질문과 이전의 질문에 매우 유사한 느낌은, 유일한 차이는, 높은 당신에게 질문을 이야기하지만, 질문은 당신이 자신을 찾을 필요

아이디어 : 첫 번째 단계와 차원 축소 동작 인 [I] [J], i 번째 동작의 전체 히스토그램 상한 기록 매트릭스 기술 한 바와 같이

 

1 1 1 0

0 0 1 1

1 1 0 1

1 1 1 0

위의 경우 우리는 그것을 넣어 수

1 1 1 0

0 0 2 1

1 1 0 2

2 1 0

그리고 각 라인은 그 라인 데이터 입력에 대한 질문에 해당하기 때문에에 대한 질문에이 치료 후, 우리는이 단조로운 스택 처리 열한의 몇 줄 필요

 

코드 :

1 #INCLUDE <. 비트 / stdc ++ H>
 2  
3  사용  스페이스 성병;
4  
5  CONST의  INT의 N + 1E5 = 7 ;
6  
7  INT의 N, m, X, ANS;
(8)  
(9)  의 INT H [N], A [N];
10  
11 스택 < INT > S;
12  
(13)  INT 주 ()
 14  
15  {
 16  
(17)      는 scanf ( " %의 D % d에 " , m, N);
18  
19       ( INT I = 0; 난 <해요; 난 ++ )
 20  
21      {
 22  
(23)          에 대한 ( INT J = 1 J <= N; ++ J )
 24  
25          {
 26  
(27)              는 scanf ( " %의 D ' , X);
(28)  
(29)              의 경우 (엑스 == 1 )은 [J] + = 1 ;
30  
31              다른 A [j는] = 0 ;
32  
33              H [J]를 = A [J]을;
34  
35          }
 36  
37          s.push (0 )
 (38)는  
39           ( INT J = . 1 ; J는 <= N- + 1. , J ++ )
 (40)  
(41)가이          {
 42는  
43이다              그동안 (H [J]를 < H [s.top ()])
 (44)는  
45              {
 46은  
47                  의 INT 인덱스 = s.top ();
 48  
(49)                  s.pop ();
 50  
(51)는                  INT의 (- J = TMP . 1 - s.top ()) * H [인덱스]; // 우리가이 증가하기 때문에 유지
 52                  // 시퀀스를 이제 위치에 적재 높이의 상단 사이의 모든 위치와,이 위치를 열거
 53                  //이 높이 위치보다 큰 열거 
54 것은                  ANS = 맥스 (ANS, TMP)
 (55)  
(56)이다              }
 (57) 인  
58              s.push (J),
 59  
(60)          }
 (61) 인  
62이다      }
 (63) 인  
64      COUT ANS << << ENDL;
 65  
66 }
코드보기

 

추천

출처www.cnblogs.com/kongbursi-2292702937/p/11277980.html