다이나믹 프로그래밍

가장 긴 바이토닉 부분 수열 (중요!)

4gats 2023. 3. 30. 17:34

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

 

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

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

www.acmicpc.net

가장 긴 감소하는 부분 수열을 구할 때

뒤에서 부터 구하는 방법을 기억하자

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
48
49
50
51
52
53
54
55
56
57
#include <iostream>
 
int a[1004];
int inc[1004];
int de[1004];
int d[1004];
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
 
    for (int i = 1; i <= n; i++)
        cin >> a[i];
 
    for (int i = 1; i <= n; i++)
    {
        inc[i] = 1;
        for (int j = 1; j <= i; j++)
        {
            if (a[j] < a[i])
            {
                if (inc[j] < inc[i])
                    continue;
                else
                    inc[i] = inc[j] + 1;
            }
        }
        
    }
 
    for (int k = n; k >= 1; k--)
    {
        de[k] = 1;
        for (int j = k + 1; j <= n; j++)
        {
            if (a[k] > a[j] && de[k] < de[j] + 1)
                de[k] = de[j] + 1;
        }
    }
 
    for (int i = 1; i <= n; i++)
    {
        d[i] = inc[i] + de[i] - 1;
    }
    
    int ans = d[1];
    for (int i = 1; i <= n; i++)
    {
        if (ans < d[i])
            ans = d[i];
    }
 
    cout << ans << '\n';
}
cs