728x90
단계별로 풀어보기 동적 계획법 1의 11단계 문제
LIS(Longest Increasing Subsequence) 문제이다.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int* numbers = new int[n];
int* dp = new int[n]; //i까지의 최장 증가하는 수열의 길이를 저장하는 배열
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
dp[0] = 0;
for (int i = 0; i < n; i++) {
int maxBeforeI = 0; //i 전까지 최장 증가하는 수열의 길이를 저장할 변수
for (int j = 0; j < i; j++) { //i 전까지
if (numbers[i] > numbers[j]) { //'증가하는' 조건을 만족하면서
if (dp[j] > maxBeforeI) //더 긴 수열이 발견되면
maxBeforeI = dp[j]; //업데이트
}
}
dp[i] = maxBeforeI + 1; // i 전까지를 구했으니까 나 자신 i를 더해줘야 한다.
}
int maxDp = 0;
for (int i = 0; i < n; i++) {
if (dp[i] > maxDp)
maxDp = dp[i];
}
cout << maxDp << endl;
return 0;
}
동적 계획법의 특징 답게 특별한 계산 없이 해를 구할 수 있다.
나보다 작으면서 나보다 이전에 있는 LIS에 1만 더해주면 된다.
728x90
'알고리즘 문제' 카테고리의 다른 글
[백준] 14501번 퇴사 (0) | 2020.01.29 |
---|---|
[백준] 1110번 더하기 사이클 (0) | 2020.01.29 |
[백준] 6603번 로또 (0) | 2020.01.29 |
[백준] 1181번 단어 정렬 (0) | 2020.01.29 |
[백준] 11050번 이항계수 1 (0) | 2020.01.28 |