삐까냥의 파도타기
Q11054. 가장 긴 바이토닉 부분 수열 본문
왼쪽에서 오른쪽 방향으로 가장 긴 부분 수열 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 |