Algorithm

백준_가장 긴 증가하는 부분수열_11053

Young_J 2021. 1. 5. 01:05

// 알고리즘

1. dp

 

2. 현재 인덱스를 기준으로 이전 인덱스들을 탐색

 -> 만약 이전값이 현재 값보다 크다면 패스

 -> 이전값이 현재 값보다 작다면 dp 테이블을 비교하여 이전값의 dp테이블 +1

 

3. 생성된 dp 테이블에서 가장 큰 값이 가장 긴 증가하는 부분수열임.

 

더보기
import java.io.*;
import java.util.*;

public class 가장긴증가하는부분수열_11053 {
	static int N, arr[], dp[];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		arr = new int[N];
		dp = new int[N];

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		int max = 0;
		for (int i = 0; i < N; i++) {
			dp[i] = 1;
			for (int j = 0; j < i; j++) {
				if (arr[i] > arr[j] && dp[i] < dp[j] + 1) {
					dp[i] = dp[j] + 1;
				}
			}
			if (max < dp[i])
				max = dp[i];
		}

		System.out.println(max);
	}

}

 

※ 공식과도 같은 문제라 한번 테이블을 그려보면서 이해하고 구현했음. 

2중 for문이기 때문에 시간복잡도는 n*n 임 따라서 n이 10만 이상 주어진다면 해당 방법으로는 풀 수 없음.