๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.11722 ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด ๋ฌธ์ ํ์ด - java
๐ ๋ฌธ์
https://www.acmicpc.net/problem/11722
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ฅผ ๋ค์ด, ์์ด A = {10, 30, 10, 20, 20, 10} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์
A = {10, 30, 10, 20, 20, 10} ์ด๊ณ , ๊ธธ์ด๋ 3์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 โค N โค 1,000)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 โค Ai โค 1,000)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ์ ๊ทผ๋ฒ
boj Q.11722 ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด ๋ฌธ์ ์ ๋๋ค.
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (LIS)๊ณผ ๋น์ทํ ์ ํ์ ๋ฌธ์ ์ ๋๋ค.
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํ์ดํ ์ ์์ต๋๋ค.
๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ต๋๊ฐ์ ์ฐพ๊ธฐ ์ํด์๋
์ฐ์ ๋ชจ๋ i๋ฒ์งธ๊น์ง์ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์์์ผ ํฉ๋๋ค.
์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ธฐ์์ ์ ํฌํจํ๋ ๋ถ๋ถ ์์ด์ ๋ชจ๋ ๊ฐ์ง๋ฏ๋ก
๊ธธ์ด๋ฅผ ๋ชจ๋ 1๋ก ์ค์ ํด์ค๋๋ค.
๊ทธ ํ
i๋ฒ์งธ๊น์ง์ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์๊ธฐ ์ํด
1๋ฒ์งธ๋ถํฐ i ๋ฒ์งธ๊น์ง์ ๋ถ๋ถ ์์ด๋ค์ ํ์ธํด์ฃผ์ด์ผ ํฉ๋๋ค.
1๋ฒ์งธ๋ถํฐ i ๋ฒ์งธ๊น์ง๋ฅผ j๋ก ํ์ํฉ๋๋ค.
if (numbers[i] < numbers[j]) {
d[i] = Math.max(d[i], d[j] + 1);
max = Math.max(d[i], max);
}
๊ฐ์ํ๊ธฐ ์ํด j๋ฒ์งธ ์ซ์๊ฐ i๋ฒ์งธ ์ซ์๋ณด๋ค ์ปค์ผ ํฉ๋๋ค.
j๋ฒ์งธ ์ซ์๊ฐ i๋ฒ์งธ ์ซ์๋ณด๋ค ํด ๋
j๋ฒ์งธ๊น์ง์ ๋ถ๋ถ์์ด์ ๊ธธ์ด+1 ์ด ํ์ฌ i๋ฒ์งธ๊น์ง์ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ณด๋ค ๊ธธ๋ค๋ฉด
๋ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด์ด๋ฏ๋ก ๊ฐฑ์ ํด์ค๋๋ค.
๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๊ฐ ๊ฐฑ์ ๋ ๋๋ง๋ค
์ต๋๊ฐ max์ ๋น๊ตํด ๊ฐฑ์ ํด์ค๋๋ค.
๋ง์ง๋ง ๋ฒ์งธ๊น์ง์ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๊ฐ ๊ตฌํด์ง๋ฉด
์ต๋ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
๐ป ์ฝ๋
package problem.dynamic;
import java.io.*;
import java.util.Arrays;
public class Main_11722 {
static int n;
static int[] d;
static int[] numbers;
static int max = 1;
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
solve();
bw.write(Integer.toString(max));
bw.flush();
bw.close();
}
public static void solve() {
Arrays.fill(d, 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
if (numbers[i] < numbers[j]) {
d[i] = Math.max(d[i], d[j] + 1);
max = Math.max(d[i], max);
}
}
}
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
numbers = new int[n + 1];
d = new int[n + 1];
String temp[] = br.readLine().split(" ");
for (int i = 1; i <= n; i++) {
numbers[i] = Integer.parseInt(temp[i - 1]);
}
br.close();
}
}