-
[백준-1912]-[다이나믹프로그래밍] - 연속합알고리즘/다이나믹프로그래밍(Dynamic Programming) 2018. 11. 11. 14:29
문제경로 : https://www.acmicpc.net/problem/1912
이문제는 굉장이 간단하게 접근 할 수 있다.
제공된 예제를 바탕으로 문제를 풀어보자.
10 10 -4 3 1 5 6 -35 12 21 -1
총 10개의 정수가 제공 되고 연속된 구간의 합 중에서 제일 큰 값이 무엇인지 출력해주면 된다.
출력은 33이 출력이 돼야 한다.
이문제를 간단하기 풀기 위해선 배열의 크기를 입력받은 사이즈 보다 한칸 더 크게 생성하면 쉽고 짧게 풀 수 있다.
첫번째 입력을 배열의 인덱스 0에 저장하지 말고 1에 저장하면 된다.
이문제를 풀기위해 필요한 변수는 구간합의 최대값을 저장하는 max 라는 변수와 입력받은 값들을 저장할 long 타입의 일차원 배열만 있으면 풀 수 있다.
1234567public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = sc.nextInt(); // 수를 입력받을 횟수long max = Long.MIN_VALUE; // 구간합의 최대값을 저장할 변수long[] arr = new long[num+1]; // 입력받은 수 또는 구간합을 저장할 long 타입 일차원 배열}cs 문제를 푸는 방법은 입력받은 횟수만큼 반복을 하면서 현재 인덱스에 입력받은 수와 이전 인덱스의 값의 합이 현재 입력 받은 수보다 크면 현재 인덱스에 값을 저장하고
그 값이 max 보다도 크면 max의 값까지 변경해주면 된다.
123456789101112for(int i=1; i <= num; i++) {arr[i] = sc.nextLong();// 구간합 구하기if(arr[i] + arr[i-1] > arr[i]) arr[i] = arr[i] + arr[i-1];// 현재 구간합이 max보다 크면 max 값 변경하기if(arr[i] > max) max = arr[i];}}cs 여기서 제일 중요한 것이 있는데 반복도 아니고 조건도 아닌 max 값의 초기 값이다.
max의 값을 0으로 초기화 한다면 모든 수가 음수로 입력 됐을때 출력이 0이 된다.
소스
12345678910111213141516public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num = sc.nextInt(); // 수를 입력받을 횟수long max = Long.MIN_VALUE; // 구간합의 최대값을 저장할 변수long[] arr = new long[num+1]; // 입력받은 수 또는 구간합을 저장할 long 타입 일차원 배열for(int i=1; i <= num; i++) {arr[i] = sc.nextLong();// 구간합 구하기if(arr[i] + arr[i-1] > arr[i]) arr[i] = arr[i] + arr[i-1];// 현재 구간합이 max보다 크면 max 값 변경하기if(arr[i] > max) max = arr[i];}System.out.println(max);}cs '알고리즘 > 다이나믹프로그래밍(Dynamic Programming)' 카테고리의 다른 글
[백준 2156] - [다이나믹프로그래밍] - 포도주 시식 (JAVA) (0) 2018.12.27 [백준-1932]-[다이나믹프로그래밍] - 정수 삼각형 (0) 2018.11.09 [백준-11726]-[다이나믹프로그래밍] - 2 x N 타일링 (0) 2018.11.09 [백준-2193]-[다이나믹프로그래밍] - 이친수 (0) 2018.11.09 [백준-1003]-[다이나믹프로그래밍] - 피보나치 수열 (0) 2018.11.09 댓글