Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 58fa9a6

Browse files
issue #44 11054 가장 긴 바이토닉 부분 수열
1 parent 90f24f2 commit 58fa9a6

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

‎src/backjoon/_11054.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package backjoon;
2+
// https://www.acmicpc.net/problem/11054
3+
4+
import java.io.BufferedReader;
5+
import java.io.IOException;
6+
import java.io.InputStreamReader;
7+
import java.util.StringTokenizer;
8+
9+
public class _11054 {
10+
static int N;
11+
static int[] seq;
12+
static int[] r_dp;
13+
static int[] l_dp;
14+
public static void main(String[] args) throws IOException {
15+
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
N = Integer.parseInt(br.readLine());
18+
19+
StringTokenizer st = new StringTokenizer(br.readLine()," ");
20+
21+
r_dp = new int[N]; // LIS
22+
l_dp = new int[N]; // LDS
23+
seq = new int[N];
24+
25+
for (int i = 0; i < N; i++) {
26+
seq[i] = Integer.parseInt(st.nextToken());
27+
}
28+
29+
LIS();
30+
LDS();
31+
32+
int max = 0;
33+
for(int i = 0; i < N; i++) {
34+
if(max < r_dp[i] + l_dp[i]) {
35+
max = r_dp[i] + l_dp[i];
36+
}
37+
}
38+
39+
System.out.println(max - 1);
40+
}
41+
42+
43+
44+
static void LIS() {
45+
46+
for(int i = 0; i < N; i++) {
47+
r_dp[i] = 1;
48+
49+
// 0 ~ i 이전 원소들 탐색
50+
for(int j = 0; j < i; j++) {
51+
52+
// j번째 원소가 i번째 원소보다 작으면서 i번째 dp가 j번째 dp+1 값보다 작은경우
53+
if(seq[j] < seq[i] && r_dp[i] < r_dp[j] + 1) {
54+
r_dp[i] = r_dp[j] + 1; // j번째 원소의 +1 값이 i번째 dp가 된다.
55+
}
56+
}
57+
}
58+
}
59+
60+
61+
62+
static void LDS() {
63+
64+
// 뒤에서부터 시작
65+
for (int i = N - 1; i >= 0; i--) {
66+
l_dp[i] = 1;
67+
68+
// 맨 뒤에서 i 이전 원소들을 탐색
69+
for (int j = N - 1; j > i; j--) {
70+
71+
// i번째 원소가 j번째 원소보다 크면서 i번째 dp가 j번째 dp+1 값보다 작은경우
72+
if (seq[j] < seq[i] && l_dp[i] < l_dp[j] + 1) {
73+
l_dp[i] = l_dp[j] + 1; // j번쨰 원소의 +1이 i번쨰 dp값이 됨
74+
}
75+
}
76+
}
77+
78+
79+
}
80+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /