파게로그
[백준 11053번] 가장 긴 증가하는 부분 수열 본문
문제 링크: 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