ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11055 : 가장 큰 증가 부분 수열
    Solve Algorithms/DP, BruteForce 2020. 4. 28. 16:56
    728x90

    출처 : https://www.acmicpc.net/problem/11055


    문제

    수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.

    예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수열은 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 이고, 합은 113이다.

    입력

    첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

    둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

    출력

    첫째 줄에 수열 A의 합이 가장 큰 증가 부분 수열의 합을 출력한다.


    접근

    • dp에 초기값으로 list와 같은 값을 넣어준다.
    • dp[i]에는 1부터 i번 중, 합이 가장 큰 증가 부분 수열의 합을 저장한다. 
    • 첫 번째 if문에서, 증가 부분 수열이므로, 현재 list[i]보다 작은 list[j]만을 대상으로 한다. 
    • 두 번째 if문에서, 현재 dp[i]가 이전의 dp[j]에 현재 list[i]를 더한 값보다 작으면, 현재 dp[i]를 갱신한다. 
    list 1 100 2 50 60
    dp 초기값 1 100 2 50 60
    dp 최종 1 100+1=101 2+1=3 50+3=53 60+53=113

    코드

    package beak;
     
    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());
            int[] list = new int[n + 1];
            int[] dp = new int[n + 1];
            int max = 0;
     
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            for (int i = 1; i <= n; i++) {
                list[i] = Integer.parseInt(st.nextToken());
                dp[i] = list[i];
            }
     
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j < i; j++) {
                    if (list[j] < list[i]) {
                        if (dp[i] < dp[j] + list[i]) {
                            dp[i] = dp[j] + list[i];
                        }
                    }
                }
            }
     
            for (int i = 1; i <= n; i++) {
                if (max < dp[i])
                    max = dp[i];
            }
     
            bw.write(max + "\n");
     
            bw.flush();
            br.close();
     
        }
    }
     
    728x90

    'Solve Algorithms > DP, BruteForce' 카테고리의 다른 글

    1309 : 동물원  (0) 2020.05.05
    11054 : 가장 긴 바이토닉 부분 수열  (0) 2020.04.30
    1699 : 제곱수의 합  (0) 2020.04.28
    11053 : 가장 긴 증가하는 부분 수열  (0) 2020.04.24
    10844 : 쉬운 계단 수  (0) 2020.04.22

    댓글

kxmjhwn@gmail.com