문제
풀이
LIS 설명이 잘 되어 있다.
DP 풀이 방식 : 시간 복잡도 O(N²)
- 인풋 배열의 크기 만큼 빈 배열(dy)을 만든다.
- 인풋 배열 i 를 순회하며 매 차례 이전 원소들 j를 검사하면서 현재 원소가 몇 번
째로 큰 원소인지 판단한다.
dy[0] = 1;
for (int i = 1; i < n; i++) {
int max = 0;
for (int j = i - 1; j >= 0; j--) {
if (arr[i] > arr[j] && dy[j] > max) max = dy[j];
}
dy[i] = max + 1;
if (dy[i] > ans) ans = dy[i];
}
잡담
전체코드
DP 풀이 O(N²)
package inflearn;
import java.util.Scanner;
public class I1003 {
static int[] dy;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
dy = new int[n];
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
System.out.println(solution(n, arr));
}
static int solution(int n, int[] arr) {
int ans = 0;
dy[0] = 1;
for (int i = 1; i < n; i++) {
int max = 0;
for (int j = i - 1; j >= 0; j--) {
if (arr[i] > arr[j] && dy[j] > max) max = dy[j];
}
dy[i] = max + 1;
if (dy[i] > ans) ans = dy[i];
}
return ans;
}
}