[DP] 백준 문제 풀이 - 11054 가장 긴 바이토닉 부분 수열

2022. 7. 6. 00:23· PS 연습
목차
  1. 👩🏻‍💻 문제링크
  2. ✍️ 아이디어
  3. ✍️소스코드

👩🏻‍💻 문제링크

https://www.acmicpc.net/problem/11054

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.acmicpc.net

 

✍️ 아이디어

1. 문제 이해

  • 저점에서 올라갔다가 최고점 찍고 내려오는 최대 긴 수열의 항의 갯수를 구하는것임  (∧ 이런 크기로 수열이 정렬되어야함)

2. 나는 2차원 배열을 이용하여 배열의 한 요소가 내려가는 중인 경우와 올라가는 중인 경우를 나눠서

1) 올라가는 중인 경우 : 자신 보다 작은 수랑만 비교 할수 있음

2) 내려가는 중인 경우 : 자신보다 작고 큰수 둘다 비교 할수 있음 

 

 

✍️소스코드

  • 난 조금 복잡하게 푼 편인듯
#include <iostream>
#include <algorithm>
using namespace std;

int result[1001][2]; //[1]은 내려가는 경우 [2]는 올라가는 경우이다
int a[1001];
int main()
{
	int n; cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
	}
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=2; j++)
		{
			result[i][j]=1;//배열 전체 1로 초기화
		}
	}
	for(int i=1; i<=n; i++)
	{
		int max1=0, max2=0;
		for(int j=i; j>0; j--)
		{
			if(a[j]>a[i]) // 배열의 요소가 내려가는 중인경우
			{
				if(max1<result[j][1]) // 올라가는 경우에서 max 찾음 (산 올라가서 꺾임 ∧)
					max1=result[j][1];
				if(max1<result[j][2]) // 내려가는 경우에서 max 찾음 (산 내려가는 중 ∧)
					max1=result[j][2];
			}
			else if(a[j]<a[i] && max2<result[j][2]) 
            // 배열의 요소가 올라가는 중인 경우는 무조건 자신보다 작은 수만 골라야함 (산 올라가는중 ∧)
			{
				max2=result[j][2];
			}
		}
		result[i][1]=max1+1;
		result[i][2]=max2+1;
	}
	int max=0;
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=2; j++)
		{
			if(max<result[i][j])
				max=result[i][j];
		}
	}
	cout<<max<<'\n';
}

 

  • 다 이렇게 풀었는데 증가수열의 최대 길이값 + 감소 수열의 최대 길이값을 더하였다 (아이디어!)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i=0; i<n; i++) {
        cin >> a[i]; //1 5 2 1 4 3 4 5 2 1 
    }
    vector<int> d(n);//증가수열 저장	
    vector<int> d2(n);//감소수열 저장
    for (int i=0; i<n; i++) { //증가수열 구하기 1 2 2 1 3 3 4 5 2 1
        d[i] = 1;
        for (int j=0; j<i; j++) {
            if (a[j] < a[i] && d[j]+1 > d[i]) {
                d[i] = d[j]+1;
            }
        }
    }
    for (int i=n-1; i>=0; i--) { //감소 수열 구하기 1 5 2 1 4 3 3 3 2 1 
        d2[i] = 1;
        for (int j=i+1; j<n; j++) {
            if (a[i] > a[j] && d2[j]+1 > d2[i]) {
                d2[i] = d2[j]+1;
            }
        }
    }
    int ans = 0; 
    for (int i=0; i<n; i++) { //증가수열 + 감소수열의 최댓값 구함
        if (ans < d[i]+d2[i]-1) {
            ans = d[i]+d2[i]-1;
        }
    }

    cout << ans << '\n';
    return 0;
}

 

체감난이도 걸린시간 참고 사용 문법
중 30min x DP

'PS 연습' 카테고리의 다른 글

[완전 탐색] 백준 문제 풀이 - 3085 사탕 게임  (0) 2022.07.10
[DP] 백준 문제 풀이 - 17404 RGB거리 2  (0) 2022.07.09
[DP] 백준 문제 풀이 - 2156 포도주 시식  (0) 2022.07.03
[DP] 백준 문제 풀이 - 9465 스티커  (0) 2022.07.02
[DP] 백준 문제 풀이 - 2225 합분해  (0) 2022.07.01
  1. 👩🏻‍💻 문제링크
  2. ✍️ 아이디어
  3. ✍️소스코드
'PS 연습' 카테고리의 다른 글
  • [완전 탐색] 백준 문제 풀이 - 3085 사탕 게임
  • [DP] 백준 문제 풀이 - 17404 RGB거리 2
  • [DP] 백준 문제 풀이 - 2156 포도주 시식
  • [DP] 백준 문제 풀이 - 9465 스티커
생선묵김치찌개
생선묵김치찌개
생선묵김치찌개
준혁's 코딩 연구기록
생선묵김치찌개
전체
오늘
어제
  • 분류 전체보기 (96)
    • Java (5)
    • Spring Boot (3)
    • 자료구조 (8)
    • 네트워크 (4)
    • 데이터베이스 (4)
    • 기술적 고민 (17)
      • Side Match (13)
      • 자리나따 (4)
    • C++ (3)
    • Algorithm (4)
    • PS 연습 (38)
    • 잡동사니 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이진트리
  • backend
  • 스프링
  • 예외처리
  • 원형 연결 리스트
  • 해커톤
  • 트리
  • DN
  • 파일 업로드
  • 자료구조
  • dp
  • 단순 연결 리스트
  • 양방향 연결 리스트
  • 재귀
  • 알고리즘
  • 완전탐색
  • open api
  • 백준
  • aws rds
  • 큐
  • CPP
  • 백준 골드
  • ㄱ
  • 브루트 포스
  • 수식트리
  • sentry
  • 열혈 자료구조
  • 배열 리스트
  • Stream
  • 스택

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
생선묵김치찌개
[DP] 백준 문제 풀이 - 11054 가장 긴 바이토닉 부분 수열
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.