반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 11054 가장 긴 바이토닉 부분 수열 본문

백준(Baekjoon) 문제

백준 11054 가장 긴 바이토닉 부분 수열

huiung 2019. 2. 15. 14:35
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 주어진 수열 중 가장 긴 바이토닉 수열을 구하는 문제입니다. 

 

바이토닉 수열이란 한 값을 기준으로 왼쪽은 증가하는 수열이고 오른쪽은 감소하는 수열을 이루는 형태를 말합니다. 

 

따라서 주어진 수열을 입력받고 수열의 첫번째 원소부터 돌면서 그 원소에서 가능한 가장긴 바이토닉 수열의 개수를 dp배열에 저장하면서 문제를 해결하여야 합니다. 완전 탐색으로 풀게 된다면 시간이 많이 걸리게 되므로 dp배열에 i인덱스에서 가능한 가장긴 수열의 개수를 저장해가면서 다음번에 그 인덱스에 저장된 값을 이용 하는 원리입니다. 

 

탐색을 할 때 다음으로 올 원소가 이전원소보다 크다면 증가하는 중이므로 true를 flag로 주고 감소한다면 false를 주면서 진행중인 수열이 감소하는 중인지 증가하는 중인지를 판별하여 가장 크기가 큰 바이토닉 수열을 찾을 수 있습니다.

 

다음은 코드입니다.

 

 #include <iostream>

using namespace std;

int N;
int arr[1001];
int dp[1001][2];
bool flag;
int maxnum;
int num;

int findfunc(int a, bool flag) {
	
	if(dp[a][flag] != 0)
		return dp[a][flag];
	
	for(int i = a+1; i < N; i++) {
		
		if(arr[a] < arr[i] && flag) 
			dp[a][flag] = max(dp[a][flag], findfunc(i, true));
		else if(arr[a] > arr[i]) {
			dp[a][flag] = max(dp[a][flag], findfunc(i, false));
		}
	}
	dp[a][flag]++;
	return dp[a][flag];
}


int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> N;
	
	for(int i = 0; i < N; i++)
		cin >> arr[i];
	
	for(int i = 0; i < N; i++) {
		maxnum = max(maxnum, findfunc(i, true));
		maxnum = max(maxnum, findfunc(i, false));
	}
	
	
	cout << maxnum;
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1197 최소스패닝 트리 (프림, 크루스칼)  (0) 2019.02.17
백준 1699 제곱수의 합  (0) 2019.02.15
백준 2167 2차원 배열의 합  (0) 2019.02.15
백준 2293 동전1  (0) 2019.02.15
백준 1010 다리놓기  (0) 2019.02.14