파게로그

[백준 11053번] 가장 긴 증가하는 부분 수열 본문

콤퓨타 왕왕기초/PS

[백준 11053번] 가장 긴 증가하는 부분 수열

파게 2020. 12. 7. 11:58

문제 링크: 11053번 가장 긴 증가하는 부분 수열

https://www.acmicpc.net/problem/11053

 

당분간 LIS 문제를 자주 접할 듯한데 정말 쉽지만은 않다고 생각된다. 이 문제의 경우 가장 긴 증가하는 부분 수열의 길이만을 알면 되므로, arr[i]보다 작은 arr[j] 중 최대인 dp[j]에 1을 더해주면 arr[i]를 포함하는 LIS의 길이가 나온다. 다만 arr[i]가 포함되지 않은 수열이 LIS일 수 있기에 dp를 모두 저장한 후 최종 출력 시 다시 한 번 최댓값을 찾아야 한다.

이는 O(n^2)의 알고리즘인데 보다 효율적인 알고리즘은 스스로의 힘으로는 힘들 것 같아 찾아서 익히고 구현해보도록 해야겠다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        /* input */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] t = br.readLine().split(" ");
        br.close();

        int[] arr = new int[n+1];
        for (int i = 1; i < n+1; i++)
            arr[i] = Integer.parseInt(t[i-1]);

        /* when n==1 */
        if (n==1) {
            System.out.println(1);
            System.exit(0);
        }

        /* logic */
        int[] dp = new int[n+1];
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            int max = 0;
            for (int j = 1; j < i; j++)
                if (arr[j] < arr[i] && dp[j] > max) max = dp[j];

            if (max != 0) dp[i] = max + 1;
            else dp[i] = 1;
        }

        int max = 0;
        for (int item : dp) if (item > max) max = item;

        System.out.println(max);
    }
}

'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글

[백준 1912번] 연속합  (2) 2020.12.13
[백준 2565번] 전깃줄  (0) 2020.12.13
[백준 2156번] 포도주 시식  (0) 2020.12.07
[프로그래머스 Lv.2] 기능개발  (0) 2020.12.03
[백준 10844번] 쉬운 계단 수  (0) 2020.12.01
Comments