파게로그

[백준 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