단조로운 스택과 큐 설명 : 포털
HDU 질문 -1506 의미 :
당신에게 사각형의 일부 높이를 제공하는 것입니다, 그래서 당신은 사각형 영역이 사각형 최대로 구성된 것을 계산
상기 한 바와 같이 피사체가 증분 주어진다면, 모든 그것 욕심를 해결하기 위해 사용될 수있다
왼쪽에서 오른쪽으로 최종 높이와 직사각형의 각각의 높이에서 그 최대 값에서 선택하도록
하지만이 증가하지 않는 경우, 중간 낮은 것, 그래서 욕심은 버려야 이상은 전체 높이 전에 취할 수있는 정책을 적용하기를 원하지만, 심지어 그 전에 그들이 최종 답변을 위해 자신의 높이를 실현되지 않을 수 있습니다 던져 무엇을 결정하기 위해 그래서 우리는 구조에 순서를 증가하고, 당신은 그것을 유지하기 위해 스택을 사용할 수 있습니다
코드 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
그리고 각 라인은 그 라인 데이터 입력에 대한 질문에 해당하기 때문에에 대한 질문에이 치료 후, 우리는이 단조로운 스택 처리 열한의 몇 줄 필요
코드 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }