[c++] Longest Increasing Sequence (λ¬Έμ ID : LIS, λμ΄λ : ν) :: μκ³ λ¦¬μ¦ λ¬Έμ ν΄κ²° μ λ΅ 1κΆ
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