[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS)
์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS)
Longest Increasing Subsequence ๋ฅผ ์ค์ฌ์ LIS๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ด์์ ์ฐ์์ ์ผ๋ก ๊ฐ์ด ์ฆ๊ฐํ๋ ์์๋ค์ ์ฐ๊ฒฐ์์ผฐ์ ๋, ๊ทธ ๊ธธ์ด๊ฐ ๊ฐ์ฅ ๊ธธ์ด์ง๋ ์์ด์ ๊ธธ์ด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, ์๋ A๋ผ๋ ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ค์ด ๋ค์ด ์๋ค๊ณ ํ์.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
A[index] | 5 | 2 | 3 | 8 | 1 | 4 | 7 |
์ด ๊ฒฝ์ฐ์์ ์ฐ๋ฆฌ๊ฐ ์ป์ ์ ์๋ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์
- 5 > 8
- 2 > 3 > 8
- 2 > 3 > 4 > 7
- 3 > 8
- 3 > 4 > 7
- 1 > 4 > 7
- 4 > 7
์ด๊ณ , ์ด ์ค ๊ธธ์ด๊ฐ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ 3๋ฒ์ ์๋ ๊ธธ์ด 4์ง๋ฆฌ ์์ด์ด๋ค.
LIS๋ฅผ ๊ตฌํ๋ ์ ๋ต์ 1) Dynamic Programming, 2) Segment Tree, 3) Binary Search ์ธ ๊ฐ์ง๋ก ๋๋๋๋ฐ, ์์ง ๋ค ๊ณต๋ถํ ์ํ๊ฐ ์๋๋ฏ๋ก ๊ณต๋ถํ ๋๋ง๋ค ํ๋์ฉ ์ถ๊ฐํ๋๋ก ํ๊ฒ ๋ค.
Dynamic Programming - O(n2)
DP๋ก LIS๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์๊ฐํด๋ณด๋ฉด, ์ด๋ค ํน์ ํ ์ง์ ์ ์ต์ฅ ๊ธธ์ด๋ ํด๋น ์ง์ ์ด์ ์ ๋์๋ ์๋ค ์ค, ๊ฐ์ด ์์ ์๋ค์ด ๊ฐ์ง ์ต์ฅ ๊ธธ์ด์ 1์ ๋ํ๋ฉด ๊ตฌํ ์ ์๋ค. DP์ ํน์ง์ ์ด๋ ค์ ์ฒซ ์ธ๋ฑ์ค๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ต์ฅ ๊ธธ์ด๋ฅผ ๊ตฌํด๊ฐ๋ฉด ์์ด์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ๋ ์ฝ๊ฒ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, DP๋ฅผ ์ํํ๋ ๋ฐฐ์ด dp์ dp[x]๋ x ์ง์ ์์์ ์ต์ฅ ์์ด ๊ธธ์ด๊ฐ ๋ ๊ฒ์ด๋ค.
์์์ ์ฌ์ฉํ๋ ๋ฐฐ์ด A๋ฅผ ์์๋ก ์ดํด๋ณด์.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
A[index] | 5 | 2 | 3 | 8 | 1 | 4 | 7 |
- A์ ์ ์ผ ์ฒ์ ์ธ๋ฑ์ค์ธ A[0]๋ ์ฆ๊ฐ ๋ถ๋ถ ์์ด ๊ธธ์ด๊ฐ ํญ์ 1์ด๋ค. ์๊ธฐ ์ด์ ์ ์์ด์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ dp[0]์๋ 1์ด ๋ค์ด๊ฐ๋ค.
- A[1]์ LIS๋ A[1] ์ ๊ฐ์ด A[0] ๋ณด๋ค ํด ๊ฒฝ์ฐ์๋ 2, ์์ ๊ฒฝ์ฐ์๋ ์๋ก์ด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ์์์ด๋ฏ๋ก 1์ด ๋ ๊ฒ์ด๋ค.
- A[2]์ LIS๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํด์ ๊ตฌํ ์ ์๋ค.
- A[2] > A[0], A[2] < A[1] :
๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ A[0]๋ ์ฐ๊ฒฐ์์ผ์ ๊ธธ์ด๋ฅผ 2๋ก ๋ง๋ค์ด์ค๋ค. - A[2] > A[1], A[2] < A[0] :
๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ A[1]๋ ์ฐ๊ฒฐ์์ผ์ ๊ธธ์ด๋ฅผ 2๋ก ๋ง๋ค์ด์ค๋ค. - A[2] > A[1], A[2] > A[0] :
A[0]์ A[1] ์ค ๊ธธ์ด๊ฐ ๋ ๊ธด ๊ฐ๊ณผ ์ฐ๊ฒฐํด์ค๋ค. - A[2] < A[0], A[2] < A[1] :
์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์ง๋๊ฐ๋ค.
- A[2] > A[0], A[2] < A[1] :
์ ์ธ ๋จ๊ณ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ ค๋ฉด ๊ฒฐ๊ตญ ํ๋์ ์ธ๋ฑ์ค ๋น, ํด๋น ์ธ๋ฑ์ค ์ด์ ์ ๋์๋ ๋ชจ๋ ์ธ๋ฑ์ค๋ค์ ๊ฐ์ด ๊ฐ์ง LIS๋ฅผ ํ์ธํด์ผํ๋ ์์ ์ด ํ์ํ๋ค. ๋ฐ๋ผ์ ์ด ๋ฐฉ์์ O(n2) ์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
์ ๋ด์ฉ์ ์ผ๋ฐํํด์ ์ฝ๋๋ก ๋ง๋ค์ด๋ณด์
for (int i = 0 ; i < A.size() ; i++){
if (dp[i] == 0) dp[i] = 1; // ์ผ๋จ ์ฒ์ ๋ง๋๋ ์์น๋ ๋ฌด์กฐ๊ฑด 1๋ก ๋ง๋ค์ด ์ฃผ๊ธฐ
for (int j = 0 ; j < i ; j++){
if(A[i] > A[j] && dp[j]+1 > dp[i]){ // ๊ธฐ์ค์ด ๋๋ ์ธ๋ฑ์ค ์ด์ ๊น์ง ๋ชจ๋ ๋๋ฉด์ ๊ธฐ์ค์ด ๋๋ ๊ฐ๊ณ ํฌ๋ฉด์ LIS๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋๋ค.
dp[i] = dp[j]+1; // ์กด์ฌํ๋ฉด ํด๋น LIS์ 1์ ๋ํ ๊ฐ์ ํ์ฌ ์์น์ ๊ธธ์ด๋ก ์ง์
}
}
}
์๊ฐ๋ณด๋ค ๋จ์ํ๋ค.
if(A[i] > A[j] && dp[j]+1 > dp[i])
์ด ์กฐ๊ฑด์ด ํท๊ฐ๋ฆด ์๋ ์๋๋ฐ, ์ ์ผ ํฐ LIS ๊ฐ์ ์ฐพ์์ ๋ง์ง๋ง์ ํ๋ฒ์ ๋ฃ์ด์ฃผ๋๊ฒ ์๋๋ผ, dp[i]์ ์ฒ์์ 1๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ ๊ธธ์ด๊ฐ 1 ์ด์์ด ๋๋ ๊ธธ์ด๋ค์ ๋ง๋๋ฉด ๊ณ์ dp[i] ๋ฅผ ์๋ก์ด ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ์ํค๋ ๊ฒ์ด๋ค.
dp[j]+1์ ํด์ฃผ๋ ์ด์ ๋ dp[i] ๊ฐ 1 ์ผ ๊ฒฝ์ฐ์ ์ด์ด์ฃผ๊ธฐ ์ํด์๋ dp[j]๊ฐ ๋ ํฐ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ 1์ ๋๋ ค์ฃผ์ด์ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem) (7) | 2021.07.17 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํํ๋ง ์ฝ๋(Huffman Code Problem) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Alogorithm) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํ๋ ฌ ๊ณฑ์ ๋ฌธ์ (Matrix Chain Multiplication) (0) | 2021.07.17 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote