개념 링크:
문제 링크:
// Top Down(Memoization)?
#include <iostream>
#include <algorithm>
#define f(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
int N;
int A[1000], lookup[1000];
int LIS(int i) {
if (!lookup[i]) {
lookup[i] = 1;
f(j, i)
if (A[i] > A[j] && lookup[i] < LIS(j) + 1)
lookup[i] = lookup[j] + 1;
}
return lookup[i];
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N;
f(i, N) {
cin >> A[i];
LIS(i);
}
cout << *max_element(lookup, lookup + N);
return 0;
}
// Bottom Up(Tabulation)
#include <iostream>
#include <algorithm>
#define f(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
int N;
int A[1000], LIS[1000];
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N;
f(i, N) {
cin >> A[i];
LIS[i] = 1;
f(j, i)
if (A[i] > A[j] && LIS[i] < LIS[j] + 1)
LIS[i] = LIS[j] + 1;
}
cout << *max_element(LIS, LIS + N);
return 0;
}