728x90
728x90
풀이
누적합문제로
https://jxxngho.tistory.com/109
저번에 포스팅한 누적합으로 배열을 채워준 후에
만약 M=2이라면 (2,2)부터 (N,N)까지 움직이면서 정답을 찾아주었다. 순회하면서
이 때 죽은 파리의 개수는 1+4+9+25 = 39
이 경우에는
68이 (1,1) ~ (3,3) 까지의 합이기 때문에
파란색 부분을 빼주어야한다.
68 - 13{(1,1)~(3,1)까지의 합} - 7{(1,1)~(1,3)까지의 합)} 을 빼주고 두 번 뺀 (1,1)을 더해준다.
이를 일반식으로 나타내자면
ans = sum[i][j] - sum[i][j-M] - sum[i-M][j] + sum[i-M][j-M]
#include <bits/stdc++.h>
using namespace std;
int main() {
int cnt = 0;
cin >> cnt;
for (int k = 0; k < cnt; k++) {
int N, M;
cin >> N >> M;
int tmp = 0;
int sum[16][16] = { 0, };
for (int i = 1; i <= N; i++) { // 누적합 구하기
for (int j = 1; j <= N; j++) {
cin >> tmp;
sum[i][j] = tmp + sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
}
}
int ans = 0;
for (int i = M; i <= N; i++) {
for (int j = M; j <= N; j++) { // M*M 최대합 구하기
int tmp2 = sum[i][j] - sum[i][j-M] - sum[i-M][j] + sum[i-M][j-M];
if (ans < tmp2) ans = tmp2;
}
}
cout <<"#"<<k+1<<" "<< ans << endl;
}
return 0;
}
728x90
728x90
'Algorihtm > SWEA' 카테고리의 다른 글
C++ SWEA 1989. 초심자의 회문 검사 (1) | 2023.10.29 |
---|---|
C++ SWEA 1984. 중간 평균값 구하기 (0) | 2023.10.29 |
C++ SWEA 1926. 간단한 369게임 (0) | 2023.10.24 |
C++ SWEA 1954. 달팽이 숫자 (1) | 2023.10.23 |
C++ SWEA [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2023.10.20 |