가장 큰 증가하는 부분 수열

Huisu·2023년 12월 4일
0

Coding Test Practice

목록 보기
77/98
post-thumbnail

문제

11055번: 가장 큰 증가하는 부분 수열

문제 설명

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

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

제한 사항

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

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

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

입출력 예

입력출력
10
1 100 2 50 60 3 5 6 7 8113

아이디어

dp 배열을 돌면서

i 번째 전에 있는 가장 큰 증가하는 부분 수열에 i 번째 수열의 값을 더하면 됨

제출 코드

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class two11055 {
    private int[] sequence;
    private int[] dp;

    public void solution() throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sequence = new int[n];
        dp = new int[n];

        for (int i = 0; i < n; i++) {
            sequence[i] = sc.nextInt();
        }
        dp[0] = sequence[0];

        for (int i = 1; i < n; i++) {
            List<Integer> candidates = new ArrayList<>();
            for (int j = 0; j < i; j++) {
                if (sequence[j] < sequence[i]) {
                    candidates.add(j);
                }
            }

            int maxValue = 0;
            for (Integer candidate : candidates) {
                maxValue = Math.max(maxValue, dp[candidate]);
            }

            dp[i] = maxValue + sequence[i];

        }

        int answer = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++) {
            answer = Math.max(answer, dp[i]);
        }
        
        System.out.println(answer);
    }

    public static void main(String[] args) throws IOException {
        new two11055().solution();
    }
}

0개의 댓글