1. 문제 요약
부분 수열을 활용한 문제
- 증가하는 부분수열이므로 추가되는 요소는 이전 요소보다 큰 값을 갖는다
- 부분 수열이므로 연속되어야 할 필요가 없다
- 생성 가능한 부분수열들 중 합이 가장 큰 경우의 합을 출력
2. 아이디어
- 생성하고자 하는 수열과 같은 크기의 배열을 만들어 각 index 에
해당 위치까지 가질 수 있는 가장 큰 수열의 합을 기록하는 방식으로 풀어보려 한다
3. 어려움 및 해결방식
- 입력값을 기록하는 배열 arr 과 부분수열의 합을 기록하는 배열 check 를 만든다
- check 를 순회한다
- 이전의 arr 값들 중 arr[i] 보다 작은 값을 갖는 index = j1, j2, ... 라고 할때
가장 큰 check[j] 의 값에 arr[i] 를 더한다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_11055_가장_큰_증가하는_부분_수열 {
static int[] arr;
static int[] check;
static int N;
static void DP(int i){
int max = 0;
for(int j = 0; j<i; j++){
if(arr[j]<arr[i] && max<check[j]){
max = check[j];
}
}
check[i] = arr[i] + max;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
check = new int[N];
StringTokenizer stk = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
arr[i] = Integer.parseInt(stk.nextToken());
}
check[0] = arr[0];
for(int i=1; i<N; i++){
DP(i);
}
int answer = Integer.MIN_VALUE;
for(int x : check){
answer = Math.max(x, answer);
}
System.out.println(answer);
}
}
'Solved > BOJ' 카테고리의 다른 글
[백준 5557] 1학년 (0) | 2023.05.24 |
---|---|
[백준 1695] 팰린드롬 만들기 (0) | 2023.05.23 |
[백준 2839] 설탕 배달 (0) | 2023.05.18 |
[백준 1106] 호텔 (0) | 2023.05.17 |
[백준 14600] 샤워실 바닥 깔기 (Small) (0) | 2023.05.16 |