LIS(Longest Increasing Subsequence)๋ ์์๊ฐ n๊ฐ์ธ ๋ฐฐ์ด์์ ์ผ๋ถ ์์๋ฅผ ๊ณจ๋ผ๋ด์ด ๋ง๋ ๋ถ๋ถ ์์ด ์ค์์ ๋ชจ๋ ์์๋ค์ด ์ด์ ์์๋ณด๋ค ํฌ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ ๊ทธ ๊ธธ์ด๊ฐ ์ต๋์ธ ๋ถ๋ถ ์์ด์ด๋ค.
์์๋ฅผ ๋ค์ด๋ณด์.
A = {10, 20, 10, 30, 20, 50}์ธ ์์ด์์ ์์๊ฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์
{10, 20}, {20, 30, 50}, {10, 30, 50} ๋ฑ์ด ์๋๋ฐ, ๊ทธ ์ค ๊ธธ์ด๊ฐ ์ต๋์ธ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๊ฐ 4์ธ {10, 20, 30, 50}์ด๋ค.
๋ํ ๋ฌธ์ ๋ ์๋์ ๊ฐ๋ค.
https://www.acmicpc.net/problem/11053
11053๋ฒ: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด
www.acmicpc.net
๐น๏ธ LIS (์ต์ฅ์ฆ๊ฐ๋ถ๋ถ์์ด) ์๊ณ ๋ฆฌ์ฆ ๊ณผ์
DP ๋๋ ์ด๋ถํ์์ ์ด์ฉํด์ ํ ์ ์๋ค.
๐น DP
์ผ์ฐจ์ ๋ฐฐ์ด๋ก ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
์์ด A = {10, 20, 10, 30, 20, 50}
10 | 20 | 10 | 30 | 20 | 50 |
1 | 2 | 1 | 3 | 2 | 4 |
๐ dp[i] ์ค ์ต๋๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
๐ธ ๊ตฌํ ๋ฐฉ๋ฒ
- ์ด์ค for ๋ฌธ์ ์ฌ์ฉํ์ฌ ํด๋น ์์๋ฅผ ์ด์ ์ ๋ชจ๋ ์์๋ค๊ณผ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ค.
dp[i] = Math.max(dp[i], dp[j]+1);
- ํด๋น ์์์ ํฌ๊ธฐ๊ฐ ๋ ํฌ๋ค๋ฉด dp๋ฐฐ์ด์ 1 ์ฆ๊ฐ์ํจ๋ค.
- ๋น๊ต๋ฅผ ๋๋ธ ํ dp ๋ฐฐ์ด์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
๐น ์ด๋ถํ์
๋ง์ฝ, ์์ด์ ํฌ๊ธฐ๊ฐ 100๋ง ์ด์์ด๋ฉด DP๋ฅผ ์ด์ฉํด์ ํ์์ ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ๐ O(n^2)
๊ทธ๋ฌ๋ฏ๋ก ์์ด์ ํฌ๊ธฐ๊ฐ ํด ๋๋ ์ด๋ถํ์์ ์ด์ฉํด์ผ ํ๋ค. ๐ O(nlogn)
๐ธ ๊ตฌํ ๋ฐฉ๋ฒ
- ์ ๋ ฅ๋ ์ ์๋ ๊ฐ๋ณด๋ค ์์ ์(0)๋ฅผ ๋ฐฐ์ด์ ๋ฏธ๋ฆฌ ๋ฃ์ด๋๋ค.
- ์ ๋ ฅ๋ฐ์ ๊ฐ์ด ์ด์ ์ ์ ๋ ฅ๋ฐ์๋ ๊ฐ๋ค๋ณด๋ค ํฌ๋ค๋ฉด ๋ฐฐ์ด์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋ฃ๋๋ค.
- ๋ฐ๋๋ก ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด ์ด๋ถํ์์ ์งํํด ์ ๋ ฅ๋ฐ์ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
- ์๋ฆฌ๋ฅผ ์ฐพ์์ผ๋ฉด ๊ธฐ์กด์ ์๋ ๊ฐ์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ผ๋ก ๋ฐ๊พผ๋ค.
- ์ฒ์ ๋ฃ์ด๋ 0์ ์ ์ธํ ๋ฆฌ์คํธ์ ์ฌ์ด์ฆ๋ฅผ ์ถ๋ ฅํ๋ค. ๐ ๋ฆฌ์คํธ ์ฌ์ด์ฆ -1
ex)
A = {10, 20, 10, 30, 20, 50}
10 ์ ๋ ฅ โ [0 10]
20 ์ ๋ ฅ โ [0 10 20]
10 ์ ๋ ฅ โ [0 10 20]
30 ์ ๋ ฅ โ [0 10 20 30]
20 ์ ๋ ฅ โ [0 10 20 30]
50 ์ ๋ ฅ โ [0 10 20 30 50] ๐ ๋ฆฌ์คํธ ์ฌ์ด์ฆ -1 = 4
B = {10, 20, 1, 2, 3, 4}
10 ์ ๋ ฅ โ [0 10]
20 ์ ๋ ฅ โ [0 10 20]
1 ์ ๋ ฅ โ [0 1 20]
2 ์ ๋ ฅ โ [0 1 2]
๐ 10, 20์ 1, 2๊ฐ ๋ฎ์ด์ด ์ด์ ๋ 20๋ณด๋ค ํฐ ์๋ ์ด์ฐจํผ 2๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ 1, 2๊ฐ 10, 20 ์ด์์ ์๋ฅผ ํฌ๊ดํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
3 ์ ๋ ฅ โ [0 1 2 3] ๐ 3์ด ์๋๋ผ 30์ด ๋์๋ ๋ฐฐ์ด ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ 1, 2๋ก ๋ฎ์ด์จ๋ ์๊ด์๋ค.
4 ์ ๋ ฅ โ [0 1 2 3 4]
๐ฉ๐ป LIS ๊ตฌํ ์ฝ๋
๐นDP
public class BOJ_11053_๊ฐ์ฅ๊ธด์ฆ๊ฐํ๋๋ถ๋ถ์์ด {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] A = new int[N];
int[] dp = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
dp[i] = 1;
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < i ; j++) {
if (A[i] > A[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int max = 0;
for (int i = 0; i < N; i++) {
max = Math.max(max, dp[i]);
}
System.out.println(max);
}
}
๐น ์ด๋ถํ์
public class LIS_BS{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
List<Integer> list = new ArrayList<>();
list.add(0);
st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
arr[i] = Integer.parseInt(st.nextToken());
int value = arr[i];
if(value > list.get(list.size()-1)) list.add(value);
// ๊ฐ์ด ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ด๋ถํ์ ์งํ
else{
int left=0;
int right = list.size()-1;
while(left < right){
int mid = (left+right)/2;
if(list.get(mid) < value) left = mid+1;
else right = mid;
}
list.set(right, value); // list์์ ์ํ๋ ์๋ฆฌ์ ๋ฃ๊ธฐ
}
}
System.out.println(list.size()-1);
}
}
'์๊ณ ๋ฆฌ์ฆ > ๐๏ธ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Simulation - 2์ฐจ์ ๋ฌํฝ์ด ๋ฐฐ์ด ๐ (0) | 2024.02.08 |
---|---|
DP - Knapsack (๋ฐฐ๋ญ๋ฌธ์ ) (1) | 2024.02.05 |
MST(์ต์์ ์ฅํธ๋ฆฌ) - ํฌ๋ฃจ์ค์นผ & ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ (1) | 2023.10.23 |
Bellman-Ford (๋ฒจ๋ง-ํฌ๋) (0) | 2023.09.08 |
LCA (์ต์๊ณตํต์กฐ์) (0) | 2023.09.04 |