본문 바로가기

Algorithm

백준 1912 연속합 Java

정답률 26퍼센트의 dp 문제이다.

연속으로 된 몇 개의 수중 가장 합이 큰 값을 구하는 문제이다.

 

점화식을 구하는 방법을 보면

dp [i]에 올 수 있는 값은

dp[i-1]+값[i]이다.

하지만 값들 중에서 음수가 있기 때문에

dp[i-1]+값[i] 보다 그냥 값[i]가 더 클 수가 있다.

 

그래서 dp[i] = Math.max(dp[i-1]+값[i], 값[i]);로 점화식을 짤 수 있다.

 

백준님의 강의자료 중..

dp[i]엔 연속된 합들이 들어가게 된다. 현재 값과 전에 값을 더했는데 현재 값 보다 작은 경우엔

dp[i]에 그냥 원래 값이 들어간다.

이렇게 구한 dp배열 중 최대 값을 출력하면 된다.

 

코드는 몇 줄 안되는데 생각하기가 참 어려운 문제이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int [] a = new int[n];
        int [] dp = new int[n];
 
        for(int i=0; i<n; i++
            a[i] = scan.nextInt();
 
        dp[0= a[0];
        for(int i=1; i<n; i++)
            dp[i] = Math.max(dp[i-1]+a[i], a[i]);
        
        Arrays.sort(dp);
        System.out.println(dp[n-1]);
    }
 
 

'Algorithm' 카테고리의 다른 글

백준 1699 제곱수의 합 Java  (1) 2019.04.15
백준 2579 계단오르기 Java  (0) 2019.04.14
백준 11053 가장 긴 증가하는 부분 수열 Java  (0) 2019.04.12
백준 2156 포도주 시식 Java  (0) 2019.04.10
백준 9465 스티커 Java  (0) 2019.04.10