가장 넓은 직사각형 구하는 알고리즘 ( O(MN) )
/* From : http://stackoverflow.com/questions/7245/puzzle-find-largest-rectangle-maximal-rectangle-problem */ int findMaxRect (int rect[XSIZE][YSIZE]) { int ret = 0; unsigned int x = 0, y = 0, k = 0; int sum[YSIZE+1] = { 0, }; int stack[YSIZE][2] = { 0, }; int stIdx = -1; int width = 0; int y0 = 0, w0 = 0, tempArea = 0; for ( x = 0; x < XSIZE; ++x ) { for ( y = 0; y <= YSIZE; ++y ) { sum[y] = rect[y][x] ? ++sum[y] : 0; } sum[YSIZE] = 0; width = 0; stIdx = -1; for ( y = 0; y <= YSIZE; ++y) { if ( sum[y] > width ) { stack[++stIdx][0] = y; stack[ stIdx][1] = width; width = sum[y]; } else if ( sum[y] < width ) { while(1) { y0 = stack[stIdx ][0]; w0 = stack[stIdx--][1]; tempArea = width * (y - y0); ret = tempArea > ret ? tempArea : ret; width = w0; if( sum[y] >= width) break; } width = sum[y]; if ( width != 0 ) { stack[++stIdx][0] = y0; stack[ stIdx][1] = w0; } } } } return ret; }
'Coding > CPP 삽질기' 카테고리의 다른 글
Bit 연산 정리 (0) | 2016.08.20 |
---|---|
printf로 디버깅 하기 (0) | 2016.04.13 |
C++ 컴파일러 (0) | 2016.03.30 |