사용한 알고리즘
알고리즘 설명
- 여왕벌의 크기의 초기값을 1로 모두 설정한다.
- 왼쪽 아래부터 위쪽 오른쪽까지 애벌레이 자라는 정도를 저장한다.
- 먼저 좌측상단 모서리 애벌레을 먼저 성장시킨다.
- 이 성장시킨 애벌레을 기준으로 나머지 부분을 채워 나간다.
- 결과를 출력한다.
풀이
// baekjoon 10836 yechan
#include <cstdio>
#include <algorithm>
using namespace std;
const int SIZE=1<<10;
const int MAX_M=702;
int M, N, K, board[MAX_M][MAX_M];
int arr[MAX_M];
int main() {
scanf("%d%d", &M, &N);
// 애벌레 크기 초기 설정
for (int i=1; i<=M; i++)
for (int j=1; j<=M; j++)
board[i][j] = 1;
// 2M-1개의 좌측상단 가장자리 애벌레의 성장속도를 저장한다.
// arr에 따른 애벌레의 성장속도는 아래와 같다.
// arr의 값 : 1 0 0 1 0 1 0 ...
// 성장 속도 : 1 1 1 2 2 3 3 ...
for (int i=0; i<N; i++) {
int pos = 1;
for (int j=0; j<3; j++) {
scanf("%d", &K);
pos+=K;
arr[pos]++;
}
}
// 왼쪽 위 모서리 부분의 애벌레을 모두 성장시킨다.
int cur_x=M, cur_y=1;
int count = 0;
int sum = 0;
for (int i=1; i<=2*M-1; i++) {
sum += arr[i];
board[cur_x][cur_y] += sum;
if (cur_x == 1) cur_y++;
else cur_x--;
}
// 나머지 부분의 애벌레를 좌측과 위쪽을 보고 성장시킨다.
for (int i=2; i<=M; i++) {
for (int j=2; j<=M; j++) {
board[i][j] = max(max(board[i-1][j-1], board[i][j-1]), board[i-1][j]);
}
}
// 결과 출력
for (int i=1; i<=M; i++) {
for (int j=1; j<=M; j++) {
printf("%d ", board[i][j]);
}
puts("");
}
return 0;
}