chaesoo
so0ob
chaesoo
전체 방문자
오늘
어제
  • 분류 전체보기 (169)
    • 알고리즘 (157)
      • 백준 다시풀기 (8)
      • solved.ac (137)
      • 백준 알고리즘 공부 (12)
    • 활동일지 (5)
    • 개발 (5)
      • Unity (4)
    • 책 공부 (2)
      • clean code (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • C++
  • 알고리즘
  • 플로이드-와샬
  • 클린코드2장
  • 소마13기
  • 백준
  • 디스코드 봇 파이썬
  • 다익스트라
  • 자료구조
  • 백준미세먼지안녕!
  • 백준2448
  • 정보처리기사 2021 합격률
  • 로스트아크 디코 봇
  • 로아 디코봇
  • 디코봇 파이썬
  • dfs
  • 게임개발
  • 유니티
  • DP
  • 디코 봇
  • BFS
  • 다시풀기
  • 문자열
  • 구현
  • SW마에스트로 13기
  • 최단거리알고리즘
  • solved.ac
  • 분할정복거듭제곱
  • 클린코드
  • 분할정복

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
chaesoo

so0ob

알고리즘/solved.ac

[class4] (백준 11054) 가장 긴 바이토닉 부분 수열

2022. 3. 10. 12:57
알고리즘
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
    '알고리즘/solved.ac' 카테고리의 다른 글
    • [class4] (백준 11779) 최소비용 구하기 2
    • [class4] (백준 1238) 파티
    • [class4] (백준 17144) 미세먼지 안녕!
    • [class4] (백준 14938) 서강그라운드
    chaesoo
    chaesoo

    티스토리툴바