[백준][11053번] 가장 긴 증가하는 부분 수열1
Updated:
문제 URLPermalink
https://www.acmicpc.net/problem/11053
나의 풀이Permalink
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] a = new int[n + 1]; // 수열
int[] d = new int[n + 1]; // i번째까지 가장긴 증가하는 부분수열의 길이
StringTokenizer str = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
a[i] = Integer.parseInt(str.nextToken());
for (int j = 1; j <= i - 1; j++) {
if (d[i] < d[j] && a[j] < a[i])
d[i] = d[j];
}
d[i] += 1;
}
int answer = 0;
for (int i = 1; i <= n; i++) {
if (answer < d[i])
answer = d[i];
}
System.out.println(answer);
}
}
다른 풀이Permalink
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i=0; i<n; i++) {
a[i] = sc.nextInt();
}
int[] d = new int[n];
for (int i=0; i<n; i++) {
d[i] = 1;
for (int j=0; j<i; j++) {
if (a[j] < a[i] && d[i] < d[j]+1) {
d[i] = d[j]+1;
}
}
}
int ans = d[0];
for (int i=0; i<n; i++) {
if (ans < d[i]) {
ans = d[i];
}
}
System.out.println(ans);
}
}
느낀점Permalink
동적계획법 을 이용한 문제다.
끝내 풀지 못하고 백준 강의를 통해 핵심개념을 파악하고 문제를 풀어봤다.
-
D[i] = A[1], …. , A[i]까지 수열이 있을때 A[i]을 마지막으로 하는 가장 긴 증가하는 부분 수열의 길이
-
A[j], A[i] (j<i) 수열이 있으면 D[i] = max(D[j]) +1
-
시간복잡도 : O(N2)
-
D[n]이 문제의 정답이 아닐 수도 있다.
Leave a comment