연속합
문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫째 줄에 답을 출력한다.
예제 입력 1
1 2
| 10 10 -4 3 1 5 6 -35 12 21 -1
|
예제 출력 1
예제 입력 2
1 2
| 10 2 1 -4 3 4 -4 6 5 -5 1
|
예제 출력 2
예제 입력 3
예제 출력 3
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter;
public class Main { public static void main(String[] args) throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(in.readLine()); String[] split = in.readLine().split(" "); int[] a = new int[t]; for (int i = 0; i < split.length; i++) { a[i] = Integer.parseInt(split[i]); } out.write("" + continuitySum(a)); out.flush(); in.close(); out.close(); }
public static long continuitySum(int[] a) { long[] dp = new long[a.length]; long result = dp[0] = a[0]; for (int i = 1; i < a.length; i++) { dp[i] = Math.max(dp[i-1] + a[i], a[i]); if (result < dp[i]) { result = dp[i]; } } return result; } }
|