๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #11052 ์นด๋“œ ๊ตฌ๋งคํ•˜๊ธฐ

by dar0m! 2020. 1. 10.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 1์ดˆ 256 MB 59.766%

https://www.acmicpc.net/problem/11052

 

11052๋ฒˆ: ์นด๋“œ ๊ตฌ๋งคํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ๋ฏผ๊ทœ๊ฐ€ ๊ตฌ๋งคํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000) ๋‘˜์งธ ์ค„์—๋Š” Pi๊ฐ€ P1๋ถ€ํ„ฐ PN๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

 

๋ฌธ์ œ

๊ตฌ๋งคํ•˜๊ณ  ์‹ถ์€ ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N ๊ณผ, 1 ~ N ๊ฐœ์˜ ์นด๋“œ ๋ฌถ์Œ์˜ ๊ฐ€๊ฒฉ P[1] ~ P[n]์ด ๋‘ ์ค„์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ P[1]์€ ์นด๋“œ ํ•œ ๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์„ ๋•Œ์˜ ๊ฐ€๊ฒฉ, P[2]๋Š” ์นด๋“œ ๋‘ ๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์„ ๋•Œ์˜ ๊ฐ€๊ฒฉ, P[3]์€ ์นด๋“œ ์„ธ ๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์„ ๋•Œ์˜ ๊ฐ€๊ฒฉ์ด ๋œ๋‹ค.

์ด ๋•Œ ์นด๋“œ N ๊ฐœ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•ด์•ผํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค.

 

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ P[i] ๋ฅผ ๊ธฐ์ค€์œผ๋กœ

  • i ๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
  • j ๋Š” i ๋ณด๋‹ค ์ž‘์€ ์ˆ˜ | 0 < j < i
  • j ๋กœ i ๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์„ ์ƒ๊ฐํ•œ๋‹ค.
  • ์ฃผ์–ด์ง„ P[i] ์™€ ์กฐํ•ฉ๋“ค์˜ ๊ฐ€๊ฒฉ์„ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์„ dp[i] ์— ์ €์žฅํ•œ๋‹ค.

์กฐํ•ฉ์€ j๋กœ i ๋ฅผ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.
์กฐํ•ฉ๋“ค์˜ ๊ฐ€๊ฒฉ์€ ์กฐํ•ฉ๋“ค ์ค‘ ๊ฐ€๊ฒฉ์˜ ํ•ฉ์ด ์ตœ๋Œ€์ธ ๊ฒƒ์ด๋‹ค.

1 ๋ถ€ํ„ฐ i ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ dp[i] ๋ฅผ ์ฑ„์šด๋‹ค๋ฉด,

dp[i]๋Š” i ๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•ด์•ผํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ€๊ฐ’์ด ๋œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ j ์™€ dp[j]์— ํ•ด๋‹นํ•˜๋Š” ์กฐํ•ฉ๊ณผ ์กฐํ•ฉ๋“ค์˜ ๊ฐ€๊ฒฉ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋‘ ๊ฐœ์˜ j ์˜ ์กฐํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€๊ฐ’ = dp[j] + dp[i-j]

์ด๋ ‡๊ฒŒ ์นด๋“œ ๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ๊ธˆ์•ก์˜ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•จ์œผ๋กœ์จ ๊ณ ๋ คํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ ์ข์•„์ง€๊ฒŒ ๋˜์–ด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
1992 KB 0 ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n, arr[1005], dp[1005];
int main() {
    scanf("%d"&n);
    for (int i = 1; i <= n; i++) {
        scanf("%d"&arr[i]);
    }
    dp[1= arr[1];
    for (int i = 2; i <= n; i++) {
        int Max = arr[i];
        for (int j = 1; j < i; j++) {
            Max = max(Max, dp[j] + dp[i - j]);            
        }
        dp[i] = Max;
    }
    printf("%d", dp[n]);
    return 0;
}
cs

๋Œ“๊ธ€