๋ฐ์ํ
https://www.acmicpc.net/problem/11053
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ๋ฅผ ์ดํดํ์ง ๋ชปํด์ ํค๋งธ๋ ๋ฌธ์ ์ด๋ค..
์๋ ์ค๋ช ๊ณผ ํจ๊ป ํ์ด๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
1. ํ ์ด๋ธ ์ ์
1์ฐจ์ ๋ฐฐ์ด dp[i]
๋ i ๋ฒ์งธ ์๊น์ง์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ์์ด์ ๊ธธ์ด๋ฅผ ๋ปํฉ๋๋ค.
์์ง ์ ์ดํด๊ฐ ์๋์๋ ๋ถ๋ค์ ์ํด ์๋ ์ฝ๋๋ก ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
10 20 30 20 30
dp[0] = 1; // 10
dp[1] = 2; // 10 -> 20
dp[2] = 3; // 10 -> 20 -> 30
dp[3] = 2; // 10 -> 20
dp[4] = 3; // 10 -> 20 -> 30
dp[0]
์ *์ ๊ฐ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์ธ๋ฐ ์์ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๊ธธ์ด 1์ ๊ฐ์ง๋๋ค. (dp[i]
๊ฐ์ 1๋ก ์ด๊ธฐํ๋ฅผ ํด์ผํฉ๋๋ค.)dp[1]
์ 0 ๋ฒ์งธ ๋ณด๋ค ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์dp[0] + 1
๊ฐ์ ๊ฐ์ง๋๋ค.dp[2]
๋ 0 ๋ฒ์งธ, 1 ๋ฒ์งธ ์์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์dp[1] + 1
๊ฐ์ ๊ฐ์ง๋๋ค.dp[3]
์ 0 ๋ฒ์งธ, 3 ๋ฒ์งธ ์์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์dp[0] + 1
๊ฐ์ ๊ฐ์ง๋๋ค.dp[4]
๋ 0 ๋ฒ์งธ, 3 ๋ฒ์งธ, 4 ๋ฒ์งธ ์์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์dp[3] + 1
๊ฐ์ ๊ฐ์ง๋๋ค.
2. ์ ํ์ ์ธ์ฐ๊ธฐ
์์์ ์ค๋ช
ํ๋ฏ์ด dp[i]
๋ j ๋ฒ์งธ ์ ๋ณด๋ค ํฐ ๊ฒฝ์ฐ, dp[j] + 1
๊ฐ์ ๊ฐ์ง๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ต๋๊ฐ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ dp[i]
์ dp[j] + 1
๊ฐ ์ค ํฐ ๊ฐ์ ์ ํํ๋ฉด ๋ฉ๋๋ค.
์์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
// ์กฐ๊ฑด : j ๋ฒ์งธ ์๋ณด๋ค i ๋ฒ์งธ ์๊ฐ ํด ๊ฒฝ์ฐ
dp[i] = Math.max(dp[i], dp[j] + 1);
3. ์ด๊ธฐ๊ฐ ์ค์
i ๋ฒ์งธ์ ์๋ค์ ๋ชจ๋ ์์ด์ ์์์ ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์, dp[i]
์ ๊ฐ์ ๋ชจ๋ 1๋ก ์ด๊ธฐํ๋ฅผ ์์ผ์ผ ํฉ๋๋ค.
for(int i=0; i<N; i++) {
dp[i] = 1;
}
๐ ์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
int[] arr = new int[N];
int[] dp = new int[N];
StringTokenizer st = new StringTokenizer(bf.readLine());
// dp ์์๋ฅผ 1๋ก ์ด๊ธฐํ!
for(int i=0; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
dp[i] = 1;
}
// i๋ฒ์งธ๋ฅผ ๊ธฐ์ค์ผ๋ก j๋ฒ์งธ์ ์๊ฐ ํฌ๋ค๋ฉด -> dp[i]+1๊ฐ๊ณผ dp[j] ์ค ํฐ ๊ฐ์ ๋ฃ์ด์ค๋๋ค.
for(int i=0; i<N; i++) {
for(int j=i+1; j<N; j++) {
if(arr[i] < arr[j]) {
dp[j] = Math.max(dp[j], dp[i] + 1);
}
}
}
// ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก dp[i] ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ๋ ฅํด์ค๋๋ค.
int MAX = 0;
for(int i=0; i<N; i++) {
if(MAX < dp[i]) MAX = dp[i];
}
System.out.print(MAX);
}
}
๋ฐ์ํ