문제
문제 분류 : dp
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <utility>
using namespace std;
int dp[1001] = { 0 };
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
int num;
int max = 0;
int max_dp = 1;
int temp = 0;
vector<int> vec;
fill_n(dp, 1001, 1);
cin >> num;
for (int i = 0; i < num; i++) {
cin >> temp;
vec.push_back(temp);
}
for (int i = 1; i < num; i++) {
max = 0;
for (int j = 0; j < i; j++) {
if (vec[i] > vec[j]) {
if (dp[j] > max)
max = dp[j];
}
}
dp[i] += max;
if (dp[i] > max_dp)
max_dp = dp[i];
}
cout << max_dp;
}
설명
이 문제를 DP로 풀기위해서 다음과 같이 접근 하였다.
모든 dp 값을 1로 초기화 한다.
- 왜냐하면 모두가 자기 자신을 수열로 가지기 때문이다.
기준 dp 값의 이전값들을 모두 탐색하여 기준 값보다 작을 경우 max라는 변수에 작은 부분의 dp의 값과 기준 dp의 값을 더한다 (n + 1)
반복하여 만약 max 값이 새로운 값보다 작다면 max 값을 변경하고 새로운 값으로 교체한다.
예시
예제문제로 {10, 20 , 10, 30 , 20 , 50}
배열이 있을 경우
dp[1]일 때
- dp[1] > dp [0] 이므로 dp[1] += dp[0] 이다.
dp[2]일 때
- dp[2] == dp[0] 이므로 넘어간다.
- dp[2] < dp[1] 이므로 넘어간다.
dp[3]일 때
- dp[3] > dp[0] 이므로 dp[3] += dp[0] 이다.
- dp[3] > dp[1] 이므로 dp[3] += dp[1] 이다.
- dp[3] > dp[2] 이므로 dp[3] += dp[2] 이다.
이렇게 반복해서 dp의 값중 가장 큰 값이 가장 긴 증가하는 부분 수열의 길이가 된다.
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 1094번 : 01타일 (0) | 2021.06.30 |
---|