https://www.acmicpc.net/problem/11054
바이토닉 수열 중에 가장 긴 길이를 찾으려면 LIS 알고리즘을 사용하면된다.
이 LIS를 왼쪽에서 오른쪽으로 가면서 i번째를 기준으로 하는 가장 긴 증가하는 부분 수열 길이를 구하고
오른쪽에서 왼쪽으로 가면서 i번째를 기준으로 하는 가장 긴 감소하는 부분 수열 길이를 더하고 중복되는 i번째를 빼주면 된다.
정답코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int dp_lis(vector<int>& v)
{
int size = v.size();
vector<int> dp1(size, 1), dp2(size, 1);
//왼쪽->오른쪽
for (int i = 0; i < size; i++)
{
for (int j = 0; j < i; j++)
{
if (v[j] < v[i])
{
dp1[i] = max(dp1[i], dp1[j] + 1);
}
}
}
//오른쪽->왼쪽
for (int i = size - 1; i >= 0; i--)
{
for (int j = size - 1; j > i; j--)
{
if (v[j] < v[i])
{
dp2[i] = max(dp2[i], dp2[j] + 1);
}
}
}
// 각 `i`에서 `dp1[i] + dp2[i] - 1`의 최댓값 찾기
int maxLength = 0;
for (int i = 0; i < size; i++) {
maxLength = max(maxLength, dp1[i] + dp2[i] - 1);
}
return maxLength;
}
int main()
{
int n;
cin >> n;
vector<int>v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
cout << dp_lis(v) << "\n";
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++][DP]2156번. 포도주 시식 (0) | 2025.02.13 |
---|---|
[백준][C++][DP]10844번. 쉬운 계단 수 (0) | 2025.02.11 |
[백준][C++][DP]11066번. 파일 합치기 (0) | 2025.02.10 |
[백준][C++]3273번. 두 수의 합 (1) | 2024.12.12 |
[백준][C++]2110번. 공유기 설치 (1) | 2024.12.02 |