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

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

[๋ฐฑ์ค€] 11055๋ฒˆ: ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด - C++ ๋ณธ๋ฌธ

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

[๋ฐฑ์ค€] 11055๋ฒˆ: ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด - C++

.23 2021. 7. 25. 01:40
๋ฌธ์ œ

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} ์ธ ๊ฒฝ์šฐ์— ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} ์ด๊ณ , ํ•ฉ์€ 113์ด๋‹ค.

 

์ž…๋ ฅ

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

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

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.


DP๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ..์ด์ž LIS ๋ฌธ์ œ์ด๋‹ค.

11053๋ฒˆ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ๋ฌธ์ œ์™€ ๋™์ผํ•˜๊ฒŒ ์ž์‹ ๋ณด๋‹ค ์•ž์— ์กด์žฌํ•˜๋Š” ๋ฐฐ์—ด ๊ฐ’ ์ค‘ ์ž‘์€ ๊ฐ’๋“ค์„ ์ฒดํฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ˆ˜์—ด์„ ๋‹ด์„ ๋ฐฐ์—ด์„ A, ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ํ•ฉ์„ ์ €์žฅํ•  ๋ฐฐ์—ด์„ D๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, A์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ์ธ A[1] ๋ถ€ํ„ฐ ์ ๊ฒ€ํ•ด๋‚˜๊ฐ„๋‹ค. i๋ฒˆ์งธ ์›์†Œ์ธ A[i]๋ฅผ ๊ธฐ์ค€์œผ๋กœ A[1]๋ถ€ํ„ฐ A[i - 1]๊นŒ์ง€ A[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , D๊ฐ’์„ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ D[i]์— ์ตœ๋Œ€ ํ•ฉ ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค. ์ด๋ฅผ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

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

2. A[i]๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ธ ์›์†Œ์˜ ์œ„์น˜๋ฅผ j๋ผ๊ณ  ํ•  ๋•Œ, j๊นŒ์ง€์˜ ์ฆ๊ฐ€ ์ˆ˜์—ด์˜ ํ•ฉ์ธ D[j]์— A[i]๋ฅผ ๋”ํ•œ D[j] + A[i], ์ฆ‰ ์ž„์‹œ์˜ D[i] ๊ฐ’์ด ๊ธฐ์กด์˜ D[i]๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋Š” D[i] = D[j] + A[i]

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

 

์ฝ”๋“œ
#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 sum = 0;

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

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

    return sum;
}
Comments