문제 : boj17550
prefix sum (누적합)을 안다면 쉽게 풀 수 있다.
누적합 배열을 하나는 n개를 원래 값 대로, 하나는 n개를 제곱해서 합한 누적합 배열을 만든다.
전자를 a, 후자를 b라고 하겠다.
그럼 이후 특정 범위의 합을 O(1)로 알 수 있으므로,
b[i] * (a[n]-a[i])에 대해 i를 1부터 n까지 진행하면서 가장 큰 값을 찾으면 된다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] sum = new int[n+1];
long[] powSum = new long[n+1];
for (int i = 1; i <= n; i++) {
int cur = Integer.parseInt(br.readLine());
sum[i] = sum[i-1]+cur;
powSum[i] = powSum[i-1]+cur*cur;
}
long max = 0;
for (int i = 1; i <= n; i++) {
max = Math.max(max, powSum[i] * (sum[n]-sum[i]));
}
System.out.println(max);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 15738 자바 - 뒤집기 (boj 15738 java) (0) | 2022.04.20 |
---|---|
백준 1940 자바 - 주몽 (boj 1940 java) (0) | 2022.04.19 |
백준 17359 자바 - 전구 길만 걷자 (boj 17359 java) (0) | 2022.04.17 |
백준 15492 자바 - 뒤집기 (boj 15492 java) (0) | 2022.04.16 |
백준 19585 자바 - 전설 (boj 19585 java) (0) | 2022.04.15 |
댓글