# 유형 : 다이나믹 프로그래밍
# https://www.acmicpc.net/problem/11055, https://www.acmicpc.net/problem/11053, https://www.acmicpc.net/problem/11722 를 풀어봤다면 문제 접근은 어렵지 않다. 특정 인덱스 까지의 앞에서부터의 증가하는 부분수열 + 뒤에서부터의 증가하는 부분수열을 생각한다면 바로 풀 수 있다.
package bj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class p11054 {
static int N;
static int arr[];
static int dp[];
static int m_dp[];
static int max=0;
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];
dp = new int[N];
m_dp = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
for(int i=0; i<N; i++) {
dp[i] = 1;
for(int j=0; j<i; j++) {
if(arr[i] > arr[j]) {
if(dp[i] < dp[j]+1)
dp[i] = dp[j]+1;
}
}
}
for(int i=N-1; i>=0; i--) {
m_dp[i]=1;
for(int j=N-1; j>i; j--) {
if(arr[i] > arr[j]) {
if(m_dp[i] < m_dp[j]+1)
m_dp[i] = m_dp[j]+1;
}
}
}
for(int i=0; i<N; i++) {
max = Math.max(max, dp[i]+m_dp[i]-1);
}
System.out.println(max);
}
}
'백준' 카테고리의 다른 글
#백준_12738 가장 긴 증가하는 부분 수열 3 - Java (0) | 2020.01.26 |
---|---|
#백준_12015 가장 긴 증가하는 부분 수열 2 - Java (0) | 2020.01.25 |
#백준_2186 문자판 - Java (0) | 2020.01.23 |
#백준_10971 외판원 순회2 - Java (0) | 2020.01.23 |
#백준_2632 피자판매 - Java (0) | 2020.01.22 |