https://www.algospot.com/judge/problem/read/LIS
๋ฌธ์
์ด๋ค ์ ์ ์์ด์์ 0๊ฐ ์ด์์ ์ซ์๋ฅผ ์ง์ฐ๋ฉด ์ด ์์ด์ ๋ถ๋ถ ์์ด (subsequence) ๋ฅผ ์ป์ ์ ์๋ค. ์๋ฅผ ๋ค์ด 10 7 4 9
์ ๋ถ๋ถ ์์ด์๋ 7 4 9
, 10 4
, 10 9
๋ฑ์ด ์๋ค. ๋จ, 10 4 7
์ ์๋ ์์ด์ ์์์ ๋ค๋ฅด๋ฏ๋ก 10 7 4 9
์ ๋ถ๋ถ ์์ด์ด ์๋๋ค.
์ด๋ค ๋ถ๋ถ ์์ด์ด ์์ฆ๊ฐํ ๋ ์ด ๋ถ๋ถ ์์ด์ ์ฆ๊ฐ ๋ถ๋ถ ์์ด (increasing subsequence) ๋ผ๊ณ ํ๋ค. ์ฃผ์ด์ง ์์ด์ ์ฆ๊ฐ ๋ถ๋ถ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
์ด๋ค ์์ด์ ๊ฐ ์๊ฐ ์ด์ ์ ์๋ณด๋ค ํด ๋, ์ด ์์ด์ ์์ฆ๊ฐ ํ๋ค๊ณ ํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C (<= 50) ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ์์ด์ ํฌํจ๋ ์์์ ์ N (<= 500) ์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค์ ์์ด์ด N๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ์ ์๋ 1 ์ด์ 100,000 ์ดํ์ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ์ผ์ด์ค๋ง๋ค ํ ์ค์ฉ, ์ฃผ์ด์ง ์์ด์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ
3
4
1 2 3 4
8
5 4 3 2 1 6 7 8
8
5 6 7 8 1 2 3 4
์์ ์ถ๋ ฅ
4
4
4
์๊ฐ์ ํ๋ฆ
-
์๋ ์์ด์์ 1๊ฐ ์์ ๊ธฐ, 2๊ฐ ์์ ๊ธฐ, ... , n-1๊ฐ ์์ ๊ธฐ๊น์ง ๊ฐ๋ฉด์ ์์จ index์ ์กฐํฉ์ ๋ชจ๋ ๊ณ์ฐํด๋ณด๊ธฐ
์กฐํฉ ๋ง๋ค๊ธฐ๊ฐ ๋๋ฌด ์ซ์ => ๋๋ฌด ๋ณต์กํจ..
-
์ฆ๊ฐํ๋ ์ต๋๊ตฌ๊ฐ์ฐพ๊ธฐ
์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด ์ค ์๋ ์์ด์์ ์ฐ์์ ์ผ๋ก ํ ๋น๋์ด์๋ ๊ฒ๋ค์ ์กฐ์ฌํ๋ค.
๊ฐ์ฅ ํฐ ์ฐ์ ๋ถ๋ถ์์ด์ ํํด์ ์ ๋ค๋ก ๋ ์๊ณ ํฐ ์๊ฐ ์๋์ง ๊ณ์ฐํ๋ค.
๋ฐ๋ก ) ์ฐ์์ ์ด์ง ์์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ๋ถ๋ถ์์ด์ด ๋์ฌ ์ ์์
=> test case 4๋ฒ์งธ
-
๊ฐ index ์ดํ์์ ๋์ฌ ์ ์๋ ์ต๋ ์ฆ๊ฐ์์ด์ ๊ธธ์ด๋ฅผ ์ ์ฅํด๋๊ธฐ
์ดํ์ ๋์ฌ index์ ๊ด๊ณ์์ด ๊ฐ index ๋ง๋ค ์ต์ ์ ๊ฒฐ์ ํ ์ ์๋ ์ต์ ๋ถ๋ถ๊ตฌ์กฐ์ด๋ฏ๋ก ์ฌ๊ทํจ์๋ก '์์ ํ์ + ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ' ๊ตฌํํ ์ ์๋ค.
์ฃผ์ํ ์
-
๋ฐฐ์ด ๋ฑ ๊ฐ์ฒด์ size ํจ์๋ฅผ for์ ์กฐ๊ฑด์์ ์ฐ๋ฉด ๋ด๋ถ์์ ๋ณํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํ ๋ชฉ์ ์ด ์๋๋ฉด for๋ฌธ ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ค๋ฅธ ๋ณ์๋ก ๋ฏธ๋ฆฌ ๋ฐ์๋๊ธฐ
int tmp = arr.size(); for(int i=0; i<tmp; i++) // for(int i=0; i<arr.size(); i++) ํ์ง๋ง๊ธฐ
์ฝ๋
#include <iostream>
using namespace std;
int N;
int arr[500];
int memorize[500];
int LIS(int index) {
if (memorize[index] != -1)
return memorize[index];
else if (index == N - 1)
return 1;
int max = 1;
for (int i = index + 1; i < N; i++) {
if (arr[index] >= arr[i])
continue;
int tmp = LIS(i);
if (max < 1 + tmp)
max = 1 + tmp;
}
memorize[index] = max;
return max;
}
int main() {
int C;
cin >> C;
while (C--) {
cin >> N;
fill(memorize, memorize + sizeof(memorize) / sizeof(int), -1);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
int max = 0;
for (int i = 0; i < N; i++) {
int tmp = LIS(i);
if (tmp > max)
max = tmp;
}
cout << max << endl;
}
}
test case (๋๊ธ ์ฐธ๊ณ , ์ง์ ๋ง๋ ๊ฒ๋ค)
6
4
1 2 3 4
8
5 4 3 2 1 6 7 8
8
5 6 7 8 1 2 3 4
8
1 5 2 6 3 0 4 7
3
1 1 1
7
9 1 3 7 5 6 20
4
4
4
5
1
5
๋ง์ง๋ง ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋๋ ๊ฒฝ์ฐ
-
max๊ฐ ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ํ ๋ฒ๋ง ๊ณ ๋ คํ ๊ฒฝ์ฐ
max ๊ธธ์ด๋ ์ฌ๋ฌ ๋ฒ ๋์ฌ ์ ์์ผ๋ฏ๋ก ๊ฐ ๊ฒฝ์ฐ์ ๋ํด ๋ค ๊ณ ๋ คํด์ฃผ์ด์ผํ๋ค.
ex_) 9 1 3 7 5 6 20 ์ ๊ฒฝ์ฐ ์ฐ์๋ ์๋ค ์ค (1,3,7), (5,6,20) ๋ ๊ฐ์ max ์ฆ๊ฐ์์ด์ด ๋์จ๋ค.
-
ํ index์ ๋ํด์๋ง ์กฐ์ฌํ์ ๊ฒฝ์ฐ
์์ ํ์์ผ๋ก ๊ตฌํํ์ ๊ฒฝ์ฐ ์ฒ์ index์์ ๋จ์ n-1๊ฐ๋ฅผ ์ฌ๊ทํจ์๋ก ํ์ํ๋๋ฐ, ์ด ๋ index๋ฅผ ํ๋์ฉ ์ฆ๊ฐ์ํค๋ฉด์ ํ์ํด์ผํ๋ค.
ex_) 0๋ฒ์งธ ์์์ ๋ํด 1~n-1๋ฒ์งธ ์์๋ฅผ ํ์ => 1๋ฒ์งธ ์์์ ๋ํด 2~n-1๋ฒ์งธ ์์๋ฅผ ํ์
์ฌ๊ธฐ์ 0๋ฒ์งธ ์์์ ๋ํด์๋ง ๊ตฌํํ๊ณ ๋ชจ๋ index๋ฅผ ๊ณ ๋ คํ๋๋ก ๋ฐ๋ณต๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํด์คฌ์ ๊ฒฝ์ฐ ํด๋น ํ ์คํธ์ผ์ด์ค๊ฐ ์ ๋๋ก ์๋๋์ง ์๋๋ค.
-
๋ ๋น ๋ฅธ ํด๋ฒ
์์์๋ถํฐ ๋ฐฐ์ด์ ๋ฃ์ผ๋ฉด์ ์ฆ๊ฐ์์ด์ด ์๋๊ฒ ๋ ๋, ํด๋น ์๊ฐ ์์นํด์ผํ ๊ณณ์ ์ฝ์ ํด์ค
ํด๋น ์๊ฐ ์์นํด์ผํ ๊ณณ์ ์ด์งํ์์ผ๋ก ์ฐพ๊ธฐ
์๊ฐ๋ณต์ก๋๊ฐ O(nlgn)์ด๋ค.
n : ์ฒ์๋ถํฐ ๋๊น์ง ์ํ
1 : ์ฆ๊ฐ์์ด์ด ์ด์ด์ง๋ ์ง ํ์ธ
lgn : ์ด์งํ์์ผ๋ก ์ฝ์ ํ ์์น ์ฐพ๊ธฐ
์ฝ๋ : https://jaimemin.tistory.com/317
Comment