삐까냥의 파도타기

Q11054. 가장 긴 바이토닉 부분 수열 본문

코딩/백준 알고리즘

Q11054. 가장 긴 바이토닉 부분 수열

금손형아 2019. 2. 19. 00:14

왼쪽에서 오른쪽 방향으로 가장 긴 부분 수열 k(n)과

오른쪽에서 왼쪽 방향으로 가장 긴 부분 수열 h(n)을 구하여


k(n) + h(n)의 최대값을 구하면 됩니다.


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.StringTokenizer;


public class Q11054 {


static long[][] dp;

public static void main(String[] args) throws Exception {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

StringTokenizer st = new StringTokenizer(br.readLine());

int num = Integer.parseInt(st.nextToken());

dp = new long[3][num+1];

st = new StringTokenizer(br.readLine());

for (int i = 1; i <= num; i++) {

dp[0][i] = Integer.parseInt(st.nextToken());

}


long maxValue = 0;

for (int i = 1; i <= num; i++) {

long inputNum = 0;

for (int j = i; j <= num; j++) {

if (dp[0][i] < dp[0][j]) {

if (inputNum == 0 || dp[0][j] <= inputNum) {

inputNum = dp[0][j];

dp[1][j] = Math.max(dp[1][j], dp[1][i]+1);

maxValue = Math.max(maxValue, dp[1][j]);

}

}

}

}

maxValue = 0;

for (int i = num; i >= 1; i--) {

long inputNum = 0;

for (int j = i; j >= 1; j--) {

if (dp[0][i] < dp[0][j]) {

if (inputNum == 0 || dp[0][j] <= inputNum) {

inputNum = dp[0][j];

dp[2][j] = Math.max(dp[2][j], dp[2][i]+1);

maxValue = Math.max(maxValue, dp[2][j]);

}

}

}

}

maxValue = 0;

for (int i = 1; i <= num; i++) {

maxValue = Math.max(maxValue, dp[1][i] + dp[2][i]);

}

System.out.println(maxValue+1);

}


'코딩 > 백준 알고리즘' 카테고리의 다른 글

Q6359. 만취한 상범  (0) 2019.02.21
Q1309. 동물원  (0) 2019.02.21
Q1965. 상자넣기  (0) 2019.02.18
Q14501. 퇴사  (0) 2019.02.17
Q11052. 카드 구매하기  (0) 2019.02.17