관리 메뉴

Storage Gonie

(13) [C++, Java] 백준 No.11722 : 가장 긴 감소하는 부분 수열 본문

알고리즘/백준풀이6. 다이나믹프로그래밍

(13) [C++, Java] 백준 No.11722 : 가장 긴 감소하는 부분 수열

Storage Gonie 2019. 5. 15. 20:20
반응형

문제

풀이

자세한 풀이 : https://ldgeao99.tistory.com/entry/챕터3-13-DP-문제-풀이3-3-백준-No11722-가장-긴-감소하는-부분-수열

 

# C++(reverse해서 가장 긴 증가하는 부분 수열의 길이를 구하는 방법을 사용)

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;

    vector<int> a(n);
    vector<int> d(n);

    for (int i = 0; i < n; i++)
        cin >> a[i];
    
    // 역순으로 변경
    reverse(a.begin(), a.end());

    // 가장 긴 증가하는 부분 수열의 길이를 구하는 방법 이용
    for (int i = 0; i < n; i++)
    {
        d[i] = 1;

        for (int j = 0; j < i; j++)
        {
            if (a[j] < a[i] && d[i] < d[j]+1)
                d[i] = d[j]+1;
        }
    }

    cout << *max_element(d.begin(), d.end()) << "\n";
}

# C++(왼쪽->오른쪽 방향으로 가장 긴 증가하는 부분 수열의 길이를 구하는 방법을 사용)

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;

    vector<int> a(n);
    vector<int> d(n);

    for (int i = 0; i < n; i++)
        cin >> a[i];

    // 역순으로 가장 긴 증가하는 부분 수열의 길이를 구하는 방법 이용
    for (int i = n-1; i >= 0; i--)
    {
        d[i] = 1;

        for (int j = n-1 ; j > i; j--)
        {
            if (a[j] < a[i] && d[i] < d[j]+1)
                d[i] = d[j]+1;
        }
    }

    cout << *max_element(d.begin(), d.end()) << "\n";
}

# Java

import java.util.*;
public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n+1];
        int[] d = new int[n+1];
        for (int i=1; i<=n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i=n; i>=1; i--) {
            d[i] = 1;
            for (int j=i+1; j<=n; j++) {
                if (a[i] > a[j] && d[i] < d[j]+1) {
                    d[i] = d[j]+1;
                }
            }
        }
        int ans = d[1];
        for (int i=2; i<=n; i++) {
            if (ans < d[i]) {
                ans = d[i];
            }
        }
        System.out.println(ans);
    }
}
반응형
Comments