티스토리 뷰

 

문제 링크 : https://www.acmicpc.net/problem/11054

 

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

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

www.acmicpc.net

 

가장 긴 단봉(unimodal) 수열, 즉 증가하다가 감소하는 수열의 길이를 구해야 한다. (증가수열, 감소수열은 허용된다.)

arr 의 index 는 1 부터 N 까지.

최대 부분 감소 수열을 구할 수 있으면 충분하다.

 

원소가 하나인 수열을 생각하면, dp 의 초기값은 모두 1 이다. 

dp[0][i] = ( i 에서 끝나는  최대 부분 증가 수열의 길이 )

dp[1][i] = ( i 에서 시작되는 최대 부분 감소 수열의 길이 )

 

loop 하나에 몰아 넣어서 처리했다.

 

전체 코드는 다음과 같다.

 

#include<bits/stdc++.h>

using namespace std;

int N, arr[1001], dp[2][1001];

int main(){
    scanf("%d", &N);
    for(int i=1;i<=N;i++) scanf("%d",&arr[i]);  
    for(int k=0;k<2;k++) for(int i=1;i<=N;i++) dp[k][i]=1;
            
    for(int i=1;i<N;i++) {
        for(int j=i+1;j<=N;j++){
            if(arr[i]<arr[j])
                dp[0][j]=max(dp[0][j], dp[0][i]+1);
            if(arr[N+1-i]<arr[N+1-j])
                dp[1][N+1-j]=max(dp[1][N+1-j], dp[1][N+1-i]+1);
        }
    }
    
    int ans=0;
    for(int i=1;i<=N;i++) ans=max(ans, dp[0][i]+dp[1][i]);
    
    printf("%d\n",ans-1);
}
반응형

'DS\Algo > Dynamic Programming' 카테고리의 다른 글

BOJ 11066 Merging Files(파일 합치기)  (0) 2022.09.14
BOJ 11048 이동하기  (0) 2022.09.11
BOJ 11052 카드 구매하기  (0) 2022.09.09
BOJ 13448 SW 역량 테스트  (0) 2022.08.21
BOJ 14165 Team Building  (0) 2022.08.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함