๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 16639 : ๊ด„ํ˜ธ ์ถ”๊ฐ€ํ•˜๊ธฐ 3

by Jaeguk 2022. 4. 19.
๋ฌธ์ œ ๋งํฌ

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

 

16639๋ฒˆ: ๊ด„ํ˜ธ ์ถ”๊ฐ€ํ•˜๊ธฐ 3

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์‹์ด ์žˆ๋‹ค. ์ˆ˜์‹์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 9๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์™€ ์—ฐ์‚ฐ์ž(+, -, ×)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ณฑํ•˜๊ธฐ์˜ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋”ํ•˜๊ธฐ์™€ ๋นผ๊ธฐ๋ณด๋‹ค ๋†’๊ธฐ ๋•Œ๋ฌธ์—, ๊ณฑํ•˜๊ธฐ๋ฅผ ๋จผ์ € ๊ณ„

www.acmicpc.net

์ฃผ์–ด์ง„ ์‹์— ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ฌธ์ œ.

ํ’€์ด

DP๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌ๊ฐ„๋ณ„๋กœ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ณ„์† ๊ตฌํ•œ๋‹ค์Œ ๋งˆ์ง€๋ง‰์— 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒ”์œ„์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ˆ˜์‹์— ๋“ค์–ด๊ฐ€๋Š” ์ˆซ์ž๋Š” 0~9์‚ฌ์ด์˜ ์ˆซ์ž์ด๋ฏ€๋กœ ์Œ์ˆ˜๋Š” ์‹์— ์ž…๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋จผ์ € ๋‚ด๊ฐ€ ํ–ˆ๋˜ ์‹ค์ˆ˜๋Š” "๊ฐ€์žฅ ํฐ ๊ฐ’" ์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ํ‚ค์›Œ๋“œ์—๋งŒ ์ง‘์ค‘ํ•ด์„œ ๊ตฌ๊ฐ„๋ณ„๋กœ ์ตœ๋Œ€๊ฐ’๋งŒ ๊ณ„์† ๊ตฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์˜ˆ์ œ๋Š” ์ž˜ ๋‚˜์™”์ง€๋งŒ "-" ๊ธฐํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ„ ์˜ˆ์ œ๋งŒ ๋งŒ๋‚˜๋ฉด ๊ฐ’์ด ์ด์ƒํ•˜๊ฒŒ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

+, -, * ๊ธฐํ˜ธ๋ณ„๋กœ ์ตœ๋Œ€๊ฐ’์ด ๋‚˜์˜ค๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž.

1. + : ์ตœ๋Œ€๊ฐ’ + ์ตœ๋Œ€๊ฐ’ = ์ตœ๋Œ€๊ฐ’

2. - : ์ตœ๋Œ€๊ฐ’ - ์ตœ์†Œ๊ฐ’ = ์ตœ๋Œ€๊ฐ’

3. * : ์–‘์ˆ˜ * ์–‘์ˆ˜ ๋˜๋Š” ์Œ์ˆ˜ * ์Œ์ˆ˜ ๋ฉด ๊ฐ€์žฅ ํฌ๊ฒ ์ง€๋งŒ ์—ฌ๊ฑด์ด ์•ˆ๋œ๋‹ค๋ฉด ์–‘์ˆ˜ * ์Œ์ˆ˜๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค.

์ฆ‰ , * ๊ธฐํ˜ธ์ผ๋•Œ๋Š” ์ตœ๋Œ€ * ์ตœ์†Œ, ์ตœ์†Œ * ์ตœ๋Œ€, ์ตœ๋Œ€ * ์ตœ๋Œ€, ์ตœ์†Œ * ์ตœ์†Œ ๋ชจ๋‘ ํ•ด๋ณด๊ณ  ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ตฌ๊ฐ„๋ณ„๋กœ "์ตœ์†Œ๊ฐ’"๋„ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ DP๋ฐฐ์—ด์„ DP[์ตœ๋Œ€ or ์ตœ์†Œ][๊ตฌ๊ฐ„ ์‹œ์ž‘์ ][๊ตฌ๊ฐ„ ๋์ ] ์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

DP[0][i][j] ๋Š” i~j ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•˜๊ณ  DP[1][i][j] ๋Š” i~j ๊ตฌ๊ฐ„์˜ ์ตœ์†Œ๊ฐ’์„ ์ €์žฅํ–ˆ๋‹ค.

๊ด„ํ˜ธ๋ฅผ ์”Œ์šฐ๋Š” ๊ตฌ๊ฐ„์€ ์ˆ˜์‹์˜ ๊ธธ์ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๊ธธ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ๊ณ ๋ คํ•ด์ฃผ์—ˆ๋‹ค.

๋งŒ์•ฝ ํ˜„์žฌ ํƒ์ƒ‰์ค‘์ธ ๊ตฌ๊ฐ„์ด 1 + 3 * 5 - 4 ๋ผ๋Š” ์‹์ด๋ผ๊ณ  ํ•˜๋ฉด (1) + (3 * 5 - 4) , (1 + 3) * (5 - 4) , (1 + 3 * 5) -  (4) ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์•„์ค€๋‹ค. ์—ฌ๊ธฐ์„œ (3 * 5 - 4) ๋˜๋Š” (1 + 3 * 5) ์˜ ์ตœ๋Œ€, ์ตœ์†Œ๊ฐ’์€ ์ด๋ฏธ ์•ž์„œ ์ฐพ์•„๋†“์•˜์„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ€์ ธ์™€์„œ ์“ฐ๋ฉด๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<intpair<intint>>vector<pair<intpair<intint>>>, greater<pair<intpair<intint>>>> Priority_queue;
const int INF_MAX = INT_MAX;
const int INF_MIN = INT_MIN;
const int MAX_N = 20;
int N;
int Num[MAX_N];
char Operator[MAX_N];
int DP[2][MAX_N][MAX_N];
int main(void)
{
    cin >> N;
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++) {
            DP[0][i][j] = INF_MIN;
            DP[1][i][j] = INF_MAX;
        }
    for (int i = 1; i <= N; i++) {
        if (i % 2 == 1)
            cin >> Num[(i + 1/ 2];
        else if (i % 2 == 0)
            cin >> Operator[i / 2];
    }
    for (int i = 1; i < (N + 1/ 2; i++) {
        if (Operator[i] == '-') {
            DP[0][i][i + 1= Num[i] - Num[i + 1];
            DP[1][i][i + 1= Num[i] - Num[i + 1];
        }
        else if (Operator[i] == '+') {
            DP[0][i][i + 1= Num[i] + Num[i + 1];
            DP[1][i][i + 1= Num[i] + Num[i + 1];
        }
        else if (Operator[i] == '*') {
            DP[0][i][i + 1= Num[i] * Num[i + 1];
            DP[1][i][i + 1= Num[i] * Num[i + 1];
        }
    }
    for (int i = 1; i <= N; i++)
        DP[0][i][i] = DP[1][i][i] = Num[i];
    for (int i = 2; i < (N + 1/ 2; i++) {
        for (int j = 1; j <= (N + 1/ 2 - i; j++) { // j ~ j + i ๊นŒ์ง€
            for (int t = 0; t < i; t++) { // t๋Š” ๊ด„ํ˜ธ๋ฅผ ์”Œ์šธ ๊ตฌ๊ฐ„์„ ์ •ํ•˜๋Š” ๊ฒฝ๊ณ„์„ 
                if (Operator[j + t] == '+') {
                    DP[0][j][j + i] = max(DP[0][j][j + i], DP[0][j][j + t] + DP[0][j + t + 1][j + i]);
                    DP[1][j][j + i] = min(DP[1][j][j + i], DP[1][j][j + t] + DP[1][j + t + 1][j + i]);
                }
                else if (Operator[j + t] == '-') {
                    DP[0][j][j + i] = max(DP[0][j][j + i], DP[0][j][j + t] - DP[1][j + t + 1][j + i]);
                    DP[1][j][j + i] = min(DP[1][j][j + i], DP[1][j][j + t] - DP[0][j + t + 1][j + i]);
                }
                else if (Operator[j + t] == '*') {
                    DP[0][j][j + i] = max(DP[0][j][j + i], max(DP[0][j][j + t] * DP[0][j + t + 1][j + i],
                        max(DP[0][j][j + t] * DP[1][j + t + 1][j + i], max(DP[1][j][j + t] * DP[1][j + t + 1][j + i], DP[1][j][j + t] * DP[0][j + t + 1][j + i]))));
 
                    DP[1][j][j + i] = min(DP[1][j][j + i], min(DP[0][j][j + t] * DP[0][j + t + 1][j + i],
                        min(DP[0][j][j + t] * DP[1][j + t + 1][j + i], min(DP[1][j][j + t] * DP[1][j + t + 1][j + i], DP[1][j][j + t] * DP[0][j + t + 1][j + i]))));
                }
            }
        }
    }
    cout << DP[0][1][(N + 1/ 2<< "\n";
    return 0;
}
cs

์ด ๋ฌธ์ œ๋ฅผ ๋Œ€ํšŒ๋‚˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ๋งŒ๋‚ฌ์œผ๋ฉด ๋ชปํ’€์—ˆ๊ฑฐ๋‚˜ ์‹œ๊ฐ„์„ ์—„์ฒญ ์žก์•„๋จน์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์•„์ง DP๋Š” ์–ด๋ ต๋‹ค.

728x90

'๋ฐฑ์ค€ > Gold' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 9874 : Wormholes  (0) 2022.04.22
[BOJ] 1800 : ์ธํ„ฐ๋„ท ์„ค์น˜  (0) 2022.04.20
[BOJ] 17780 : ์ƒˆ๋กœ์šด ๊ฒŒ์ž„  (0) 2022.04.15
[BOJ] 10021 : Watering the Fields  (0) 2022.04.14
[BOJ] 15684 : ์‚ฌ๋‹ค๋ฆฌ ์กฐ์ž‘  (0) 2022.04.14