본문 바로가기

Coding/백준

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

 11053번을 풀면 쉽게 풀 수 있는 DP문제.

 

 1. 0부터 N-1까지 증가하는 부분 수열을 구한다.

 2. N-1부터 0까지 증가하는 부분 수열을 구한다.

 3. 0부터 N-1까지 구한 두 부분 수열의 값을 더하면서 최댓값을 찾는다. (가장 긴 바이토닉 부분 수열이다)

 4. 이때 해당 원소가 중복되기 때문에 최댓값에서 -1을 해준다.

      ex)  num ->   1 2 3 2 1

               dp1 ->   1 2 3 2 1

              dp2 ->   1 2 3 2 1

       dp1+dp2 = 6(최댓값), 원소 3이 중복되므로 -1, 정답은 5.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#define MAX 1001
using namespace std;
 
int dp1[MAX];
int dp2[MAX];
int num[MAX];
int N;
 
void solved(){
    for(int i=0;i<N;i++){
        dp1[i]=1;
        for(int j=0;j<i;j++){
            if(num[i]>num[j]){
                dp1[i]=max(dp1[i],dp1[j]+1);
            }
        }
    }
    
    for(int i=N-1;i>=0;i--){
        dp2[i]=1;
        for(int j=N-1;j>i;j--){
            if(num[i]>num[j]){
                dp2[i]=max(dp2[i],dp2[j]+1);
            }
        }
    }
    
    int ans=0;
    
    for(int i=0;i<N;i++){
        ans=max(ans,dp1[i]+dp2[i]);
    }
    
    cout << ans-1 << endl;
}
 
int main(){
    cin >> N;
    
    for(int i=0;i<N;i++){
        cin >> num[i];
    }
    
    solved();
}
 
cs

 

'Coding > 백준' 카테고리의 다른 글

1956번 운동  (0) 2020.02.28
2458번 키 순서  (0) 2020.02.28
1520번 내리막 길  (0) 2020.02.27
7576번 토마토  (0) 2020.02.25
15482번 한글 LCS  (0) 2020.02.24