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

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

[๋ฐฑ์ค€] 11722๋ฒˆ: ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด - C++ ๋ณธ๋ฌธ

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

[๋ฐฑ์ค€] 11722๋ฒˆ: ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด - C++

.23 2021. 7. 26. 22:59
๋ฌธ์ œ

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 30, 10, 20, 20, 10} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 30, 10, 20, 20, 10}  ์ด๊ณ , ๊ธธ์ด๋Š” 3์ด๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค.

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

 

์ถœ๋ ฅ

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

 


DP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ.

์‚ฌ์‹ค์ƒ 11053๋ฒˆ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ๋ฌธ์ œ์—์„œ ๊ด„ํ˜ธ๋งŒ ๋ฐ”๊พธ๋ฉด ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์„ค๋ช…์€ ๋งํฌ ์ฐธ์กฐ.

 

์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. A ๋ฐฐ์—ด ๋‚ด์—์„œ A[i]๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. (1 ≤ i ≤ N, 1 ≤ j < i)

2. A[i]๋ณด๋‹ค ํฐ ๊ฐ’์ธ ์›์†Œ์˜ ์œ„์น˜๋ฅผ j๋ผ๊ณ  ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ D[i]๋ฅผ ๊ตฌํ•œ๋‹ค.

        2-1. D[i]  D[j], A[i]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” A[j]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด D[j]์— A[i]๋ฅผ ํฌํ•จํ•˜์—ฌ 1์„ ๋”ํ•œ ๊ฐ’์ด๋ฏ€๋กœ D[i] = D[j] + 1

        2-2. D[i] > D[j], A[i]๊นŒ์ง€์˜ ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” ์—ฌ์ „ํžˆ D[i] = D[i]

3. D[i]๊นŒ์ง€์˜ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’(์ตœ๋Œ€ ๊ธธ์ด)์„ length์— ์ €์žฅ.

 

์ฝ”๋“œ
#include <cstdio>
#define MAX 1001

int DP(int num);

int main(void) {
    int n;
    scanf("%d", &n);
    printf("%d\n", DP(n));
    return 0;
}

int DP(int num) {
    int A[MAX] = { 0 };
    int memo[MAX] = { 0 };
    int length = 0;

    for(int i = 1; i <= num; i++) {
        scanf("%d", &A[i]);
    }

    for(int i = 1; i <= num; i++) {
        memo[i] = 1;
        for(int j = 1; j < i; j++) {
            if(A[i] < A[j]) {
                memo[i] = (memo[i] > memo[j] ? memo[i] : memo[j] + 1);
            }
        }
        length = (length > memo[i] ? length : memo[i]);
    }

    return length;
}
Comments