https://www.acmicpc.net/problem/1912
import java.util.*;
import java.io.*;
//10
//10 -4 3 1 5 6 -35 12 21 -1
//33
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int[] dp = new int[N];
int max = arr[0];
dp[0] = arr[0];
for (int i = 1; i < N; i++) {
dp[i] = Math.max(arr[i], dp[i - 1] + arr[i]);
max = Math.max(dp[i], max);
}
System.out.println(max);
}
}
dp
로 해결해야한다. 브루트포스같은 방법을 사용하면 시간초과가 발생한다.dp
에 대한 표는 많다. 여기서는 간략히 설명하겠다.1 -6 10
이라는 수열이 있다고 생각하자.1) 10만 선택하거나
2) 이전 수열의 합인 -5에 10을 더한 5를 선택하거나
두가지이다.dp[i-1]
이다.
dp[i] = Math.max(arr[i], dp[i - 1] + arr[i]);
200,000
이기 때문에 O(n^2)을 하면 40,000,000,000
, 즉 4백억이라는 시간이 걸린다. 제한 시간에 따르면 최대 1억개의 루프 안에 해결해야하기 때문에 브루트포스로는 해결할 수 없다.dp
도 많이 연습해야겠다.