[실전 문제] 연속 부분 최대합 L
2021. 2. 27. 10:51ㆍ코딩 테스트/실전 문제
1. 문제
N개의 정수가 주어질 때, 연속된 부분을 선택하여 합을 최대화 하는 프로그램을 작성하시오. 예를 들어, 아래와 같이 8개의 숫자가 있을 경우, 색칠된 부분을 선택했을 때 그 합이 가장 최대가 된다.
입력
첫 번째 줄에 n이 주어진다. ( 1 ≤ n ≤ 1,000,000 ) 두 번째 줄에 n개의 정수가 주어진다.
출력
연속된 부분을 선택하였을 때의 최댓값을 출력한다.
예제 입력
case 1)
8
2 3 -5 8 -3 4 2 -9
case 2)
5
-1 -2 3 -2 4
예제 출력
case 1) 11
case 2) 5
2. 풀이
이 문제의 점화식은 다음과 같다.
- T(i) = max(T(i-1) + Data(i), Data(i))
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
int value = Integer.parseInt(st.nextToken());
if(i == 0) {
arr[i] = value;
}
else {
if(value < arr[i-1] + value) arr[i] = arr[i-1] + value;
else arr[i] = value;
}
}
int max = -987987987;
for(int i = 0; i < n; i++) {
if(max < arr[i]) max = arr[i];
}
bw.write(max + "");
br.close();
bw.flush();
bw.close();
}
}
728x90
'코딩 테스트 > 실전 문제' 카테고리의 다른 글
[실전 문제] 팰린드롬 만들기 (0) | 2021.02.27 |
---|---|
[실전 문제] 두 문자열 사이의 거리 (0) | 2021.02.27 |
[실전 문제] 자원 채취 (0) | 2021.02.27 |
[실전 문제] 제곱수의 합 (0) | 2021.02.25 |