반응형
클릭시 이동합니다.
어떻게 풀까?
블럭들을 보시면 최대 4x4 영역 안에 들어온다는 것을 알 수 있습니다.
간단하게, 4x4 영역 안에 블럭에 들어오는 영역이면 1, 아니면 0으로 표시하면,
모든 (i,j) 영역에 대해서 위에서 저장한 값을 곱해서 더하면 블럭에 대한 더하기 값을 알 수 있습니다.
이 중 최댓값을 반환하면 되겠죠!
다만 위처럼 배열 인덱스 초과가 나지 않도록 하기위해, 오른쪽과 아래에 0의 값을 가지도록 영역을 더 넓혀서 계산합시다!
테트로미노 사전을 만드는 것이 문제 푸는것 보다 오래 걸리는 문제입니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | #include<iostream> #include<cstring> #include<cstdio> using namespace std; struct TetInfo { int blocks[5][8][16] = { { { 1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, { 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0 } }, { { 1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0 } }, { { 1,0,0,0, 1,0,0,0, 1,1,0,0, 0,0,0,0 }, { 1,1,1,0, 1,0,0,0, 0,0,0,0, 0,0,0,0 }, { 1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0 }, { 0,0,1,0, 1,1,1,0, 0,0,0,0, 0,0,0,0 }, { 0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0 }, { 1,0,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0 }, { 1,1,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0 }, { 1,1,1,0, 0,0,1,0, 0,0,0,0, 0,0,0,0 } }, { { 1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0 }, { 0,1,1,0, 1,1,0,0, 0,0,0,0, 0,0,0,0 }, { 0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0, }, { 1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0 } }, { { 0,1,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0 }, { 1,1,1,0, 0,1,0,0, 0,0,0,0, 0,0,0,0 }, { 0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0 }, { 1,0,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0 } } }; int blockNum[5] = {2,1,8,4,4}; int map[503][503]; int n, m; void init() { memset(map,0,sizeof(map)); scanf("%d %d\n", &n, &m); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) scanf("%d", &map[i][j]); } int getMax() { int max = -1; for(int r = 0 ; r < n; r++) { for(int c = 0 ; c < m ; c++) { for(int i = 0; i < 5; i++) { for(int j = 0; j < blockNum[i]; j++) { int sum = 0; for(int row = 0; row < 4; row++) { for(int col = 0; col < 4; col++) { sum = blocks[i][j][row*4+col] ? sum + map[r+row][c+col] : sum; } } max = max < sum ? sum : max; } } } } return max; } } info; int main() { info.init(); int res = info.getMax(); printf("%d\n", res); return 0; } | cs |
시간 복잡도
맵 전체를 훑어보기 때문에 시간복잡도는 입니다.
반응형
'공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[삼성 기출 문제] 백준 14502 연구소 (0) | 2018.12.01 |
---|---|
[삼성 기출 문제] 백준 14501 퇴사 (3) | 2018.12.01 |
[삼성 기출 문제] 백준 14499 주사위 굴리기 (1) | 2018.12.01 |
[삼성 기출 문제] 백준 3190 뱀 (0) | 2018.11.30 |
[삼성 기출 문제] 백준 12100 2048 (easy) (2) | 2018.11.30 |