์๊พธ ๊น๋จน๋ LIS ํ๋ฒ ์ ๋ฆฌํด๋ณด๊ธฐ
Longest Increase Sequence
์ ์ฝ์. ์ต์ฅ ์ฆ๊ฐ ์์ด
๋ก๋ ๋ถ๋ฆฐ๋ค.
์๋์ ๊ฐ์ ์์ด์ด ์๋ค๊ณ ํ์.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
value | 2 | 3 | 1 | 4 | 7 | 5 | 3 |
์ด ๊ฒฝ์ฐ, ๊ฐ์ฅ ๊ธธ๊ฒ ์ฆ๊ฐํ๋ sequence
๋ 2 -> 3 -> 4 -> 7
์ด๋ฉฐ, ๊ธธ์ด๋ 4๊ฐ ๋๋ค. LIS
๋ ์ด๋ฌํ ๊ฐ์ฅ ๊ธด ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด๋ฅผ ํ์ดํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์.
DP[j]
๋ฅผ j๋ฒ์งธ์์์ LIS
๋ผ๊ณ ์ ์ํ๋ฉด, DP์ ์ผ๋ฐํญ์ ์๋์ ๊ฐ์ด ์ธ์ธ ์ ์๋ค. ์๋์์ i
๋ฒ์งธ๋ i < j
์ธ ์กฐ๊ฑด์์ ํ์ธ์ด ๋์ด์ผ ํ๋ค.
if (A[i] < A[j])DP[j] = max(DP[j], DP[i] + 1);
์ฌ๊ธฐ์ j
๋ i
๋ณด๋ค ์ปค์ผ ํ๋ค. (์ฆ๊ฐํ๋ ์์์ด๋ฏ๋ก) ๋ฃจํ๋ฅผ ํฌํจํ ์ ์ฒด ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
DP[0] = 1; // ์ฒซ๋ฒ์งธ ์์๋ ๋ฌด์กฐ๊ฑด 1์ LIS๋ฅผ ๊ฐ์ง๋ค.for(int j = 1; j < sz; ++j) { // j๋ฒ์งธ๋ฅผ ์ฑ์ธ ๋, [0, j)๊น์ง ํ์ธํด์ max ๊ฐ์ ์ฌ์ฉํ๋ค.for(int i = 0; i < j; ++i) { // i < jif (A[i] < A[j])DP[j] = max(DP[j], DP[i] + 1);}}
์ฌ๊ธฐ์ LIS
๊ฒฐ๊ณผ๊ฐ์ DP[]
์ ์ต๋๊ฐ + 1์ด๋ค. ๊ทธ๋ฆฌ๊ณ , ์๊ฐ๋ณต์ก๋๋ O(n^2)
๊ฐ ๋ ๊ฒ์ด๋ค.
์ด์ง Trickyํ ๋ฐฉ์์ด๋ค. ์์์ 2์ค ํฌ๋ฌธ์ ๋๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ? ๊ทธ๊ฒ์ DP
๋ฐฐ์ด์ ์
๋ฐ์ดํธ ์์๊ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ๋ ๋ฐฉ์์์ ๋ฒ์ด๋์, A[i] < A[j]
์ธ ์กฐ๊ฑด์ ์ง์ ์ ์ผ๋ก DP
๋ฐฐ์ด์ ์ ์ฅํ ์ ์๋ค๋ฉด? ๊ทธ ๊ฒฝ์ฐ์๋ ์ต์ข
์ ์ผ๋ก DP
๋ฐฐ์ด์ ์ฌ์ด์ฆ๊ฐ ๋ต์ด ๋ ๊ฒ์ด๋ค.
๊ตฌ์ฒด์ ์ธ ๊ตฌํ ๋ฐฉ์์ Binary Search
๋ฅผ ์ฌ์ฉํ๋ค. ๊ฐ ์์์ ๋ํด์ Binary Search
๋ฅผ ์ํํ๋ฉด์ DP
๋ฐฐ์ด์ ๋ฃ์ผ๋ฉด ๋๊ณ , ์ด ๊ฒฝ์ฐ ์ ์ฒด ๋ฐฐ์ด์ 1ํ๋ง scan ํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ O(n log n)
์ด ๋๋ค. ์ด์ ๋ ์๊ฐ๋ณต์ก๋๋ O(n^2)
์ ๋นํด ์๋นํ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ํ ์ ์๋ค.
vector<int> DP;for(int i = 0; i < sz; ++i) {auto it = lower_bound(DP.begin(), DP.end(), A[i]);if (it == DP.end()) {DP.push_back(A[i]);} else {*it = A[i];}}
์ฌ๊ธฐ์ LIS
๊ฒฐ๊ณผ๊ฐ์ DP
๋ฐฐ์ด์ size๊ฐ ๋๋ค. ์ด๋ ๊ฒ DP
์ ๊ด์ ์ ๋ฐ๊พธ๋ ๊ฒ๋ง์ผ๋ก ์๊ฐ๋ณต์ก๋๊ฐ ํฌ๊ฒ ๊ฐ์ ๋ ์ ์๋ค.
๋ง์ฝ ์ด ๋ฐฉ๋ฒ์์ ์ค์ LIS
๋ฅผ ์ด๋ฃจ๋ ๋ฐฐ์ด์ ์์์ผ ํ๋ค๊ณ ํ๋ค๋ฉด, push_back
๋๋ ์์ ์ ์์๋ค๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์๋๋ค.