티스토리 뷰
https://www.acmicpc.net/problem/10211
풀이
dp에 저장되는 값 = Math.max(이전 인덱스까지의 누적 합 - 현재 배열의 값, 현재 배열의 값)
예를 들어, 입력으로 2 1 -2 3 -5이 들어왔을 때 계산을 해보자. 참고로 계산을 편하기 하기 위해서 arr과 dp 크기를 1씩 증가시킨다.
arr[1]에는 2가 저장되어 있고, dp[1]에는 Math.max(dp[0] + arr[1], arr[1])을 저장한다. -> Math.max(2, 1)
arr[2]에는 1이 저장되어 있고, dp[2] = Math.max(dp[1] + arr[2], arr[2])을 저장한다. -> Math.max(3, 1)
arr[3]에는 -2가 저장되어 있고, dp[3] = Math.max(dp[2] + arr[3], arr[3])을 저장한다. -> Math.max(1, -2)
arr[4]에는 3이 저장되어 있고, dp[4] = Math.max(dp[3] + arr[4], arr[4])을 저장한다. -> Mathm.max(4, 3)
arr[5]에는 -5가 저장되어 있고, dp[5] = Math.max(dp[4] + arr[5], arr[4])을 저장한다. -> Math.max(-1, -5)
따라서 4번 인덱스까지의 누적 합인 4가 최대 값이다.
static int solution(int[] arr) {
int[] dp = new int[arr.length];
dp[0] = arr[0];
int max = Integer.MIN_VALUE;
for(int i = 1; i < dp.length; i++) {
dp[i] = Math.max(arr[i], dp[i - 1] + arr[i]);
max = Math.max(max, dp[i]);
}
return max;
}
코드
import java.io.*;
import java.util.*;
public class Main {
static int T;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
T = Integer.parseInt(br.readLine());
while (T-- > 0) {
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
sb.append(solution(arr) + "\n");
}
System.out.println(sb);
}
static int solution(int[] arr) {
int[] dp = new int[arr.length];
dp[0] = arr[0];
int max = Integer.MIN_VALUE;
for(int i = 1; i < dp.length; i++) {
dp[i] = Math.max(arr[i], dp[i - 1] + arr[i]);
max = Math.max(max, dp[i]);
}
return max;
}
}