336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 숫자를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 숫자는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
import java.util.Scanner; //https://www.acmicpc.net/problem/1912 public class ConsecutiveSum { static int n; static int[] array; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); n = Integer.parseInt(scan.nextLine().trim()); array = new int[n]; for (int i = 0; i < n; i++) { array[i] = scan.nextInt(); } System.out.println(consecutiveArrayCal()); } static public int consecutiveArrayCal() { int maxData = array[0]; for (int i = 0; i < array.length; i++) { int calData = 0; for (int j = i; j < array.length; j++) { calData += array[j]; if (maxData < calData) { int tmp = maxData; maxData = calData; calData = tmp; } } } return maxData; } }
위의 예제는 for문을 2개 이용하여 정답을 구했지만 시간초과.... 배열이 길수록 n제곱이되니 시간초과가 된다.
다이나믹 프로그래밍 기법을 이용하여 메모이제이션을 이용한 아래 예제가 정답이 나왔다.
푸는데 진짜 오래걸렸다. 다이나믹 프로그래밍 문제가 제일 어려운듯 휴....
import java.util.Scanner; //https://www.acmicpc.net/problem/1912 public class ConsecutiveSum { static int n; static int[] array; static int[] cache; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); n = Integer.parseInt(scan.nextLine().trim()); array = new int[n]; cache = new int[n]; for (int i = 0; i < n; i++) { array[i] = scan.nextInt(); } System.out.println(consecutiveArrayCal()); } static public int consecutiveArrayCal() { cache[0] = array[0]; int max = cache[0]; for (int i = 1; i < array.length; i++) { cache[i] = Math.max(array[i], array[i] + cache[i - 1]); cache[i] = Math.max(array[i], cache[i]); if (max < cache[i]) max = cache[i]; } return max; } }
'알고리즘 및 자료구조 > 문제' 카테고리의 다른 글
백준알고리즘 1463번 1로 만들기 (0) | 2016.03.14 |
---|---|
백준알고리즘 2193번 이친수 (0) | 2016.03.08 |
백준알고리즘 2293번 동전 1 (0) | 2016.03.07 |
백준알고리즘 1946번 신입사원 (0) | 2016.03.03 |
백준알고리즘 2167번 2차원 배열의 합 (0) | 2016.03.03 |