[Silver II] 가장 긴 감소하는 부분 수열 - 11722
성능 요약
메모리: 12280 KB, 시간: 104 ms
분류
다이나믹 프로그래밍
제출 일자
2023년 11월 24일 09:38:05
문제 설명
수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} 이고, 길이는 3이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 감소하는 부분 수열의 길이를 출력한다.
dp | 0 | 10 | 30 | 10 | 20 | 20 | 10 |
D | 0 | 1 | 1 | 2 | 2 | 2 | 3 |
A | 0 | 10 | 30 | 10 | 20 | 20 | 10 |
1. 이전에 있었던 자신보다 큰 Arr값 중 D값이 가장 큰 걸 가져온다.
2.. 그 후 자신의 D값을 Val + 1로 해준다.
3. 그 중 최대값이 정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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[] arr = new int[n+1];
int result = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 1; i <= n ;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int[] dp = new int[n+1];
for(int i = 1; i <= n ;i++){
int val = 0;
for(int j = 0; j < i; j++){
// 자신보다 큰 arr 값중 dp값이 최대인 걸 찾음
if(arr[j] > arr[i] && dp[j] > val){
val = dp[j];
}
}
// 최대인 Dp값에 현재 Index값을 포함하기 위해 + 1
dp[i] = val + 1;
// 최대값을 연산 과정에서 찾기 위해서 Max값을 찾는 연산 추가
result = Math.max(dp[i],result);
}
System.out.println(result);
}
}
'알고리즘 - Baekjoon > Silver' 카테고리의 다른 글
[백준] 11004번 : K번째 수 Silver5(실버 5) - JAVA[자바] (0) | 2023.11.24 |
---|---|
[백준] 11652번 : 카드 Silver4(실버4) - JAVA[자바] (0) | 2023.11.24 |
[백준] 24511번 : queuestack Silver3(실버 3) - JAVA[자바] (1) | 2023.11.23 |
[백준] 2346번 : 풍선 터뜨리기 Silver3(실버3) - JAVA[자바] (1) | 2023.11.23 |
[백준] 28279번 : 덱2 Silver 4(실버4) - JAVA[자바] (0) | 2023.11.23 |