Algorithm, boj, 가장 긴 바이토닉 부분 수열(11054)
풀이
- dp[i]는 i번째의 수가 기준이 되어 바이토닉 수열이 될때 최대의 길이 이다
- 바이토닉 수열은 S1 < S2 < … Sk-1 < Sk > Sk+1 > … SN-1 > SN 를 만족 해야 하므로 기존에 증가하는 부분수열, 감소하는 부분수열의 합을 구하면 된다
- dp1[i]는 i번째 수가 가장 큰 증가하는 부분수열.
- dp2[i]는 i번째 수가 가장 큰 감소하는 부분수열.
- max는 dp1[i] + dp2[i] - 1(자기자신 중복된것 제외) 중에서 가장 큰값을 구한다.
package org.baekjoon;
import java.util.Scanner;
public class test11054_dp_Lis {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] dp1 = new int[n];
int[] dp2 = new int[n];
int max = 0;
int[] arr = new int[n];
for (int i=0; i<n; i++) {
arr[i] = sc.nextInt();
dp1[i] = 1;
dp2[i] = 1;
}
for (int i=1; i<n; i++) {
for (int j=0; j<i; j++) {
if (arr[i] > arr[j]) {
dp1[i] = Math.max(dp1[j]+1, dp1[i]);
}
}
}
for (int i=n-2; i>=0; i--) {
for (int j=i+1; j<n; j++) {
if (arr[i] > arr[j]) {
dp2[i] = Math.max(dp2[j]+1, dp2[i]);
}
}
}
for (int i=0; i<n; i++) {
max = Math.max(dp1[i] + dp2[i], max);
}
System.out.println(max-1);
}
}
Reference