๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

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

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/๋ฐฑ์ค€

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

.23 2021. 7. 28. 01:01
๋ฌธ์ œ

์ˆ˜์—ด S๊ฐ€ ์–ด๋–ค ์ˆ˜ Sk๋ฅผ ๊ธฐ์ค€์œผ๋กœ S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด, ๊ทธ ์ˆ˜์—ด์„ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, {10, 20, 30, 25, 20}๊ณผ {10, 20, 30, 40}, {50, 40, 25, 10} ์€ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด์ง€๋งŒ,  {1, 2, 3, 2, 1, 2, 3, 2, 1}๊ณผ {10, 20, 30, 40, 20, 30} ์€ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด ์•„๋‹ˆ๋‹ค.

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์ด๋ฉด์„œ ๊ฐ€์žฅ ๊ธด ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


DP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ. ์—ญ์‹œ๋‚˜ ์•ž์˜ ๋ฌธ์ œ๋“ค์ฒ˜๋Ÿผ LIS ๋ฌธ์ œ์ธ๋ฐ, ์•ž์„œ ํ’€์—ˆ๋˜ ๋ฌธ์ œ๋“ค์„ ์กฐ๊ธˆ ์‘์šฉํ•˜์—ฌ ํ’€์–ด์•ผํ•œ๋‹ค.

๋ฐ”์ดํ† ๋‹‰ ์ˆ˜์—ด์˜ ํŠน์ง•์„ ๊ณ ๋ คํ•˜์—ฌ ๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์—ด A์˜ i๋ฒˆ์งธ ์›์†Œ A[i]๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌํ•ด์•ผ ๋˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. A[1]๋ถ€ํ„ฐ A[i]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด

2. A[N]๋ถ€ํ„ฐ A[i]๊นŒ์ง€์˜ ์—ญ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด(A[i]๋ถ€ํ„ฐ A[N]๊นŒ์ง€ ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด)

 

1๋ฒˆ๊ณผ 2๋ฒˆ์„ ๊ฐ๊ฐ ๊ธฐ๋กํ•œ ๋ฐฐ์—ด์„ Increase[]์™€ Decrease[]๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ๋ณ„ ํ•ฉ(Increase[i] + Decrease[i], 1 ≤ i ≤ N)์„ ๊ตฌํ•˜์—ฌ ํ•ฉ์ด ์ตœ๋Œ“๊ฐ’์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด์ด๋‹ค. ์ด ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ์œผ๋กœ ๊ตฌํ•œ ์ตœ๋Œ“๊ฐ’์—๋Š” A[i]๊ฐ€ ์ค‘๋ณตํ•ด์„œ ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ“๊ฐ’์— 1์„ ๋นผ์ค€ ๊ฐ’์ด ์ตœ์ข… ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ๋œ๋‹ค.

 

๐Ÿ”— Increase() ํ•จ์ˆ˜์™€ Decrease() ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ์ž‘๋™ ์›๋ฆฌ : 11053๋ฒˆ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ฝ”๋“œ
#include <cstdio>
#include <vector>

using namespace std;

vector<int> A;
vector<int> Increase(int n);
vector<int> Decrease(int n);
int sum(vector<int> Inc, vector<int> Dec);

int main(void) {
    int n;
    scanf("%d", &n);
    A.resize(n + 1);

    for(int i = 1; i <= n; i++) scanf("%d", &A[i]);
    printf("%d\n", sum(Increase(n), Decrease(n)));
    return 0;
}

vector<int> Increase(int n) {
    vector<int> Inc(n + 1);
    for(int i = 1; i <= n; i++) {
        Inc[i] = 1;
        for(int j = 1; j < i; j++) {
            if(A[i] > A[j] && Inc[i] < Inc[j] + 1) {
                Inc[i]++;
            }
        }
    }
    return Inc;
}

vector<int> Decrease(int n) {
    vector<int> Dec(n + 1);
    for(int i = n; i > 0; i--) {
        Dec[i] = 1;
        for(int j = n; j >= i; j--) {
            if(A[i] > A[j] && Dec[i] < Dec[j] + 1) {
                Dec[i]++;
            }
        }
    }

    return Dec;
}

int sum(vector<int> Inc, vector<int> Dec) {
    int max = 0;
    for(int i = 1; i < Inc.size(); i++) {
        max = (Inc[i] + Dec[i] > max ? Inc[i] + Dec[i] : max);
    }
    return max - 1;
}

 

Comments