LIS
๐ซ LIS
Longest Increasing Subsequence | ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด |
DP๋ก ํ ์ ์๋ ๋ฌธ์ .
์์ด์์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ์ฐพ๋ ๋ฌธ์ .
๐ซง ์ฉ์ด ์ ๋ฆฌ
๋ถ๋ถ ์์ด
= ์์ด์ ์์ ์ค ์ผ๋ถ๋ฅผ ์ ํํด์(ํน์ ์ ๊ฑฐํด์) ๋ง๋ ์์ด
i.e. 1 2 3 4
์์ 1 3 4
, 2 4
๋ฑ
์ฆ๊ฐ ๋ถ๋ถ ์์ด
= ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ถ๋ถ ์์ด
i.e. 1 2 3 4
, 3 5 7 9
๋ฑ
์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด
= ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด
๐ซ ์๊ณ ๋ฆฌ์ฆ
๐ซง O(N^2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const int MX = 1005;
int a[MX];
int d[MX];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int mxLen = 0;
for (int i = 1; i <= n; i++)
{
int curA = a[i];
int curDMax = 0;
for (int j = 0; j < i; j++)
{
int tarA = a[j];
int tarD = d[j];
if (tarA < curA)
if (tarD >= curDMax)
curDMax = tarD;
}
d[i] = curDMax + 1;
mxLen = max(mxLen, d[i]);
}
cout << mxLen;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int n;
cin >> n;
vector<int> a(n);
vector<int> d(n);
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
{
d[i] = 1;
for (int j = 0; j < i; j++)
if (a[j] < a[i] && d[i] < d[j] + 1)
d[i] = d[j] + 1;
}
cout << *max_element(d.begin(), d.end());
๐ซง O(N log N)
O(N^2) ๋ฐฉ๋ฒ์ ์ต์ ํํ์ฌ O(N log N)์ผ๋ก ๋ง๋ค ์ ์๋ค.
O(N^2) ๋ฐฉ๋ฒ์ ํด๋น ์์ ์์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๊ณ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ด๋ผ๋ฉด,
O(N log N) ๋ฐฉ๋ฒ์ ํด๋น ์์ ์์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ์์ฒด๋ฅผ ๋ง๋ค์ด ๊ฐฑ์ ํ๋ ๋ฐฉ์์ด๋ค.
O(N log N) ๋ฐฉ๋ฒ์ ํด๋น ์์ ์์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง๋ค์ด ๊ฐฑ์ ํ๋ ๋ฐฉ์์ด๋ค.
์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ด lis๊ฐ ๋์ง๋ ์๋๋ค, ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ ๊ธธ์ด๊ฐ lis์ ๊ธธ์ด๊ฐ ๋๋ค.
์ด์ง ํ์ (lower_bound)๋ฅผ ์ด์ฉํ์ฌ,
ํด๋น ์์ ์ ๋ง๋ค์ด์ง ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง์ง๋ง ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ด ๋์ค๋ฉด ๊ทธ ๊ฐ์ ์ถ๊ฐํ๊ณ ,
์์ ๊ฐ์ด ๋์ค๋ฉด lower_bound๋ก ์์ ๊ฐ์ด ๋์ฒดํ ์ ์๋ ์์น๋ฅผ ์ฐพ์ ๋์ฒดํ๋ค.
(๋ญ๊ฐ ์ค๋ช ์ด ์ง๊ด์ ์ด์ง ์๋ค. ๊น๋จน์๋ค๋ฉด ์ฝ๋ ๋ณด๋ฉด์ ์ดํดํ ๊ฒ.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
// ํด๋น ์์ ์์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด, ๊ทธ ์ค์์ ์์๋ค์ ๊ฐ์ด ๊ฐ์ฅ ์์ ์์ด์ ๋ง๋ค์ด ๋๊ฐ๋ค.
vector<int> lis;
for (int i = 0; i < n; i++)
{
// ์ด์ง ํ์์ผ๋ก a[i]๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด ์๋์ง ํ์ธ (๊ทธ ์ค ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๊ฐ)
// ์ฌ๊ธฐ์๋ ์ผ๋จ a[i]๋ณด๋ค ํฐ ๊ฐ์ ์ฐพ๊ณ , ๊ทธ๊ฑธ a[i] ๋์ฒดํ๊ณ ์ถ๋ค๋ ์๊ฐ
auto it = lower_bound(lis.begin(), lis.end(), a[i]);
// ์์ผ๋ฉด ๋ค์ ์ถ๊ฐ
if (it == lis.end())
{
lis.push_back(a[i]);
}
// ์์ผ๋ฉด ๊ทธ ๊ฐ์ a[i]๋ก ๊ต์ฒด
else
{
*it = a[i];
// ๊ต์ฒดํ๋ ์ด์ ๋ ์ ์ฒด์ ์ผ๋ก ์์๋ค์ ๊ฐ์ด ์์์ผ ๋์ค์ ๋ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ง๋ค ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๊ธฐ ๋๋ฌธ
// ์๋ฅผ ๋ค์ด 5 1 2๋ผ๋ ์์ด์์, ๊ฐ ์์๋ฅผ ์ํํ๋ฉฐ LIS๋ฅผ ๊ตฌํ๋ค๊ณ ๊ฐ์
// 5๊น์ง ์ํ๋ฅผ ํ๊ณ , (ํ์ฌ LIS๋ {5})
// 1๋ฅผ ์ํํ๋ ์ฐจ๋ก์์,
// 5๋ฅผ 1๋ก ๋ฐ๊ฟ๋ ์ด์ฐจํผ ๊ธธ์ด๋ ๋๊ฐ๋ค๊ณ 5๋ฅผ ๊ทธ๋๋ก ๋๋ฉด ์ต์ข
์ ์ผ๋ก LIS๋ฅผ {5}๋ก ๋ง๋ค ์ ๋ฐ์ ์๋ค.
// ์๋ํ๋ฉด 2๋ 5๋ณด๋ค ์์์ ๋ชป ๋ค์ด๊ฐ๋๊น.
// ๋ง์ฝ 5๋ฅผ 1๋ก ๋ฐ๊ฟจ๋ค๋ฉด, {1}๋ก ์์ํ๋ LIS๋ฅผ ๋ง๋ค ์ ์๊ณ
// ๊ทธ ๋ค์ 2๋ฅผ ์ํํ๋ ์ฐจ๋ก์์, {1}์ 2๋ฅผ ์ถ๊ฐํ๋ฉด {1, 2}๋ก LIS๋ฅผ ๋ง๋ค ์ ์๋ค.
}
}
cout << lis.size();
์ฃผ์ ์๋ ์ฝ๋.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
vector<int> lis;
for (int i = 0; i < n; i++)
{
auto it = lower_bound(lis.begin(), lis.end(), a[i]);
if (it == lis.end())
{
lis.push_back(a[i]);
}
else
{
*it = a[i];
}
}
cout << lis.size();
๐ซ ๊ธฐ๋ก
- ์ฐธ๊ณ : โ๋๋ฌด์ํค - ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ดโ
- ์ฐธ๊ณ : โdoonghoon - Longest Increasing Subsequence (LIS)๋ฅผ NlogN์ ๊ตฌํ๊ธฐโ
๐ซ ๋ฌธ์
- ๋ฌธ์ ์ง
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (11053)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 (12015)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 3 (12738)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 4 (14002)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5 (14003)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 6 (17411)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด K (18837)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด k (18838)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ks (18892)
- ๊ฐ์ฅ ํฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (11055)
- ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ถ๋ถ ์์ด (17216)
- ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด (11054)
- ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด (11722)
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ํฐ๋ฆฐ๋๋กฌ ๋ถ๋ถ์์ด (16161)