본문 바로가기
JAVA/백준

[Java] 백준 13398 연속합 2 - 동적 계획법(7)

by 푸_푸 2023. 1. 14.
728x90

백준 13398 연속합 2
문제

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다. 또, 수열에서 수를 하나 제거할 수 있다. (제거하지 않아도 된다)

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 수를 제거하지 않았을 때의 정답은 12+21인 33이 정답이 된다.

만약, -35를 제거한다면, 수열은 10, -4, 3, 1, 5, 6, 12, 21, -1이 되고, 여기서 정답은 10-4+3+1+5+6+12+21인 54가 된다.

입력

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

출력

첫째 줄에 답을 출력한다.


제출

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		int[] A = new int[N];
		for (int i = 0; i < N; i++) {
			A[i] = Integer.parseInt(st.nextToken());
		}
		int[] L = new int[N];
		L[0] = A[0];
		int result = L[0];
		for (int i = 1; i < N; i++) {
			L[i] = Math.max(A[i], L[i - 1] + A[i]);
			result = Math.max(result,  L[i]);
		}
		int[] R = new int[N];
		R[N - 1] = A[N - 1];
		for (int i = N - 2; i >= 0; i--) {
			R[i] = Math.max(A[i], R[i + 1] + A[i]);
		}
		for (int i = 1; i < N - 1; i++) {
			int temp = L[i - 1] + R[i + 1];
			result = Math.max(result,  temp);
		}
		bw.write(result + "\n");
		bw.flush();
		bw.close();
		bw.close();
	}
}


예제

10
10 -4 3 1 5 6 -35 12 21 -1

결과

백준 13398 연속합 2

 

 

13398번: 연속합 2

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

728x90

댓글