시간 제한이 1초이고, 수열의 크기가 1000이므로 1000 * 1000을 하였을 때 1억 번을 넘지 않아 이중 반복문으로 풀이 할 것을 예상했다.
DP 문제들이 대부분 배열과 점화식을 사용해 해결하다보니 자연스럽게 C 배열로 선언해서 풀었었는데, 다른 풀이를 검색해서 보니 벡터를 사용하는 것이 훨씬 깔끔해 바꾸었다.
핵심은 이중 반복문으로 경우의 수를 전부 순회하며 가장 긴 수열을 만드는 DP 배열 값을 찾는 것이다.
우선 현재 인덱스 i 가 이전 인덱스들의 수보다 당연히 커야 하며, 이전 인덱스의 수보다 i 인덱스 수가 크다면 그때 dp 배열을 검사해 max ( i번째 값, dp[j] + i번째 값) 을 실행해 갱신해 주면 된다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> a, dp;
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int input;
cin >> input;
a.push_back(input);
}
dp.assign(N, 1);
int ans = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < i; j++)
{
if (a[i] > a[j])
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(dp[i], ans);
}
//14002번
cout << ans << '\n';
vector<int> ansv;
int cnt = ans;
for (int i = N-1; i > -1; i--)
{
if (dp[i] == cnt)
{
ansv.push_back(a[i]);
cnt--;
}
}
for (int i = ans - 1; i > -1; i--)
{
cout << ansv[i] << " ";
}
return 0;
}
'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글
[C++ / 백준 1699번] 제곱수의 합 (0) | 2024.11.23 |
---|---|
[C++ / 백준 1912번] 연속합 (0) | 2024.11.22 |
[C++/백준 15990번] 1, 2, 3 더하기 5 (0) | 2024.11.14 |
[C++/백준 1463번] 1로 만들기 (0) | 2024.10.30 |
[C++/백준 11576번] Base Conversion (0) | 2024.10.30 |