๋ฐฑ์ค€/C++

[๋ฐฑ์ค€/C++] 11054๋ฒˆ ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด

yulee_to 2022. 7. 20. 22:44

๋ฐฑ์ค€
11054๋ฒˆ ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด


๐Ÿค”๋ฌธ์ œ ์ดํ•ด

์–ด๋Š ํ•œ ์ˆซ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์—๋Š” ๊ฐ์†Œํ•˜๋Š” ์ˆซ์ž๋“ค์ด, ์˜ค๋ฅธ์ชฝ์—๋Š” ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž๋“ค์ด ์˜ค๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ด๋•Œ, ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ๋‚˜์˜ฌ ์ˆ˜ ์—†๋‹ค.


๐Ÿ’ก์ฒซ๋ฒˆ์งธ ์•„์ด๋””์–ด

๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ์‘์šฉ ๋ฒ„์ „์ด์—ˆ๋‹ค. 

 

๐Ÿ”ฅํ’€์ด๐Ÿ”ฅ

dp_in[i]๋Š” i๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋งˆ์ง€๋ง‰ ์ˆ˜๋กœ ํ–ˆ์„ ๋•Œ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ ,

dp_de[i]๋Š” i๋ฒˆ์งธ ์ˆ˜๋ฅผ ์ฒซ๋ฒˆ์งธ ์ˆ˜๋กœ ํ–ˆ์„ ๋•Œ ๊ฐ์†Œํ•˜๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

1. dp_in๊ณผ dp_de๋Š” ๋ชจ๋‘ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

2. ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ๋‹ค์Œ ์ˆซ์ž๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ํ˜„์žฌ dp_in๊ณผ ์ด์ „๊ฐ’ dp_in์— 1์„ ๋”ํ•œ ๊ฐ’ ์ค‘์—์„œ ๋” ํฐ ๊ฐ’์„ dp_in์˜ ํ˜„์žฌ๊ฐ’์— ๋„ฃ์–ด์ค€๋‹ค.

3. ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ๋‹ค์Œ ์ˆซ์ž๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ํ˜„์žฌ dp_de์™€ ์ด์ „๊ฐ’ dp_de์— 1์„ ๋”ํ•œ ๊ฐ’ ์ค‘์—์„œ ๋” ํฐ ๊ฐ’์„ dp_de์˜ ํ˜„์žฌ๊ฐ’์— ๋„ฃ์–ด์ค€๋‹ค.

4. dp_in๊ณผ dp_de์˜ i๋ฒˆ์งธ ์ˆ˜๋Š” ๊ฒน์น˜๋ฏ€๋กœ dp_in๊ณผ dp_de๋ฅผ ๋”ํ•˜๊ณ  1์„ ๋นผ์ค€ ๊ฐ’๋“ค์„ ๋น„๊ตํ•ด์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

โŒํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

์œ„ ํ’€์ด์—์„œ์˜ 4๋ฒˆ์—์„œ dp_in + dp_de๋ฅผ ํ•ด์ค„ ๋•Œ ๊ฒน์น˜๋Š” ๊ฐ’ 1์„ ๋นผ์ฃผ์ง€ ์•Š์•„์„œ ํ‹€๋ ธ์—ˆ๋‹ค.


#include <iostream>
#include <cmath>

using namespace std;

int dp_in[1001];
int dp_de[1001];
int arr[1001];
int n;

int main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    for (int i = 0; i < n; i++) {
        dp_in[i] = 1;
        dp_de[i] = 1;
    }

    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[j] < arr[i]) {
                dp_in[i] = max(dp_in[i], dp_in[j] + 1);
            }
        }
    }

    for (int i = n - 1; i >= 0; i--) {
        for (int j = n - 1; j >= i; j--) {
            if (arr[j] < arr[i]) {
                dp_de[i] = max(dp_de[i], dp_de[j] + 1);
            }
        }
    }

    int result = dp_in[0] + dp_de[0] - 1;
    for (int i = 1; i < n; i++) {
        int tmp = dp_in[i] + dp_de[i] - 1;
        if (result < tmp) result = tmp;
    }
    cout << result;
}
728x90