[백준/DP] 11053번 가장 긴 증가하는 부분 수열 (JAVA)
11378 단어 알고리즘백준ProblemSolvingProblemSolving
문제
풀이
O(n^2)의 복잡도로 풀 수 있는 문제다.
arr[]
: 주어진 배열 값dp[i]
:arr[i]
를 수열의 마지막으로 할 때의 가장 긴 증가하는 수열의 길이
- 현재
arr[i]
보다 앞의arr[j]
값이 작은 경우에만 증가하는 수열에arr[i]
를 추가할 수 있으므로, 앞의dp[j]
값들 중 최댓값을 찾아max
에 저장한다.- 만약
arr[i]
값이 앞선 모든 값들보다 큰 경우, 새로운 증가하는 수열을 만든다는 의미로 0을 저장한다.- 이렇게 배열의 모든 값을 순회한 후,
dp[]
의 최댓값을 찾으면 정답이다.arr[n]
이 증가하는 수열의 끝이라고 보장할 수 없으므로 최댓값을 따로 찾아서 리턴해야 한다.
코드
import java.io.*;
public class Main {
private static final int MAXIMUM = 1000;
private static int n;
private static int[] arr = new int[MAXIMUM + 1];
private static int[] dp = new int[MAXIMUM + 1];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine());
String[] line = br.readLine().split(" ");
for (int i = 1; i <= n; i++) arr[i] = Integer.parseInt(line[i - 1]);
dp();
bw.append(String.valueOf(getMax()));
br.close();
bw.close();
}
private static void dp() {
dp[1] = 1;
for (int i = 2; i <= n; i++) {
int max = 0;
for (int j = i - 1; j >= 1; j--)
if (arr[i] > arr[j]) max = Math.max(max, dp[j]);
dp[i] = max + 1;
}
}
private static int getMax() {
int max = 0;
for (int val : dp) max = Math.max(max, val);
return max;
}
}
Author And Source
이 문제에 관하여([백준/DP] 11053번 가장 긴 증가하는 부분 수열 (JAVA)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jwkim/dp-11053저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)