알고리즘 |
dp |
[문제 본문]
더보기
문제
수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다.
예를 들어, {10, 20, 30, 25, 20}과 {10, 20, 30, 40}, {50, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20, 30} 은 바이토닉 수열이 아니다.
수열 A가 주어졌을 때, 그 수열의 부분 수열 중 바이토닉 수열이면서 가장 긴 수열의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 부분 수열 중에서 가장 긴 바이토닉 수열의 길이를 출력한다.
예제 입력 1
10 1 5 2 1 4 3 4 5 2 1
예제 출력 1
7
힌트
예제의 경우 {1 5 2 1 4 3 4 5 2 1}이 가장 긴 바이토닉 부분 수열이다.
[푼 코드]
#include <iostream>
using namespace std;
int N;
int arr[1001];
int dp[1001][2]; // [n][0]에 오름차순 [n][1]에 내림차순
int Solved()
{
//오름차순
for (int i = 0 ; i < N; i++)
{
dp[i][0] = 1;
for (int j = 0; j <= i; j++)
{
if (arr[j] < arr[i] && dp[i][0] < dp[j][0] + 1)
{
dp[i][0] = dp[j][0] + 1;
}
}
}
//내림차순
for (int i = N-1; i >= 0; i--)
{
dp[i][1] = 1;
for (int j = N-1; j >= i; j--)
{
if (arr[j] < arr[i] && dp[i][1] < dp[j][1] + 1)
{
dp[i][1] = dp[j][1] + 1;
}
}
}
int result=0;
for (int i = 0; i < N; i++)
{
if (result < dp[i][0] + dp[i][1] - 1)
{
result = dp[i][0] + dp[i][1] - 1;
}
}
return result;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
cout << Solved();
return 0;
}
#dp #백준 #알고리즘 #백준11054
728x90
반응형
'알고리즘 > solved.ac' 카테고리의 다른 글
[class4] (백준 11779) 최소비용 구하기 2 (0) | 2022.03.11 |
---|---|
[class4] (백준 1238) 파티 (0) | 2022.03.10 |
[class4] (백준 17144) 미세먼지 안녕! (0) | 2022.03.09 |
[class4] (백준 14938) 서강그라운드 (0) | 2022.03.09 |
[class4] (백준 10830) 행렬 제곱 (0) | 2022.03.08 |