๋ฐฑ์ค€/Gold

[BOJ] 18858 : ํ›ˆ๋ จ์†Œ๋กœ ๊ฐ€๋Š” ๋‚ 

Jaeguk 2022. 4. 6. 12:28
๋ฌธ์ œ ๋งํฌ

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

 

18858๋ฒˆ: ํ›ˆ๋ จ์†Œ๋กœ ๊ฐ€๋Š” ๋‚ 

1 ์ด์ƒ M ์ดํ•˜์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธธ์ด N์˜ ์ˆ˜์—ด ์ค‘ ๋…ผ์‚ฐ์ธ ๊ฒƒ์˜ ๊ฐœ์ˆ˜๋ฅผ 998,244,353์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

๋…ผ์‚ฐ(Non-์‚ฐ)์ธ ์ˆ˜์—ด์ด ๋ช‡ ๊ฐœ์ธ์ง€ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ.

ํ’€์ด

๋…ผ์‚ฐ์ด๋ž€ Non-์‚ฐ ์ฆ‰ ์‚ฐ์ด ์•„๋‹Œ ์ˆ˜์—ด์„ ์˜๋ฏธํ•œ๋‹ค. a1 < a2 > a3 ์ฒ˜๋Ÿผ ์˜ฌ๋ผ๊ฐ”๋‹ค ๋‚ด๋ ค๊ฐ€๋Š” ํ˜•ํƒœ์˜ ์ˆ˜์—ด์„ ์‚ฐ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋กœ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ DP๋ฐฐ์—ด์„ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ• ์ง€๊ฐ€ ๊ด€๊ฑด์ธ๋ฐ, ์ˆ˜์—ด์˜ i๋ฒˆ์งธ ์ˆ˜์— ๋Œ€ํ•ด์„œ 3๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

1. i-1๋ฒˆ์งธ ์ˆ˜์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ i๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ. ์ฆ‰, ์˜ฌ๋ผ์˜จ ๊ฒฝ์šฐ(์˜ค๋ฅด๋ง‰)

2. i-1๋ฒˆ์งธ ์ˆ˜์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ i๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๋” ์ž‘์€ ๊ฒฝ์šฐ. ์ฆ‰, ๋‚ด๋ ค์˜จ ๊ฒฝ์šฐ(๋‚ด๋ฆฌ๋ง‰)

3. i-1๋ฒˆ์งธ ์ˆ˜์™€ i๋ฒˆ์งธ ์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ. ์ฆ‰, ๊ทธ๋Œ€๋กœ(ํ‰์ง€)

DP๋ฐฐ์—ด์„ DP[1~M][์ˆ˜์—ด์˜ ๋ช‡๋ฒˆ์งธ ์ˆซ์ž์ธ์ง€(1~N)][์˜ค๋ฅด๋ง‰์ธ์ง€, ๋‚ด๋ฆฌ๋ง‰์ธ์ง€ ํ‰์ง€์ธ์ง€]

๋‚˜๋Š” ์˜ค๋ฅด๋ง‰์„ 0, ํ‰์ง€๋ฅผ 1, ๋‚ด๋ฆฌ๋ง‰์„ 2๋กœ ์ •ํ–ˆ๋‹ค.

1.  i-1๋ฒˆ์งธ ์ˆ˜ < i๋ฒˆ์งธ ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ์ฆ‰ i-1 -> i ๊ฐ€ ์˜ค๋ฅด๋ง‰์ธ ๊ฒฝ์šฐ์—๋Š” i-2 -> i-1 ์ด ์˜ค๋ฅด๋ง‰์ด๋“  ํ‰์ง€์ด๋“  ๋‚ด๋ฆฌ๋ง‰์ด๋“  ์ƒ๊ด€์—†๋‹ค. ์˜ค๋ฅด๋ง‰ -> ์˜ค๋ฅด๋ง‰, ํ‰์ง€ -> ์˜ค๋ฅด๋ง‰, ๋‚ด๋ฆฌ๋ง‰ -> ์˜ค๋ฅด๋ง‰ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2. i-1๋ฒˆ์งธ ์ˆ˜ = i๋ฒˆ์งธ ์ˆ˜ ์ธ ๊ฒฝ์šฐ. ์ฆ‰, i-1 -> i ๊ฐ€ ํ‰์ง€์ธ ๊ฒฝ์šฐ์—๋„ ์—ญ์‹œ i-2 -> i-1 ์€ ์˜ค๋ฅด๋ง‰, ํ‰์ง€, ๋‚ด๋ฆฌ๋ง‰ ๋ชจ๋‘ ์ƒ๊ด€์—†๋‹ค.

์˜ค๋ฅด๋ง‰ -> ํ‰์ง€, ํ‰์ง€ -> ํ‰์ง€, ๋‚ด๋ฆฌ๋ง‰ -> ํ‰์ง€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3. i-1๋ฒˆ์งธ ์ˆ˜ > i๋ฒˆ์งธ ์ˆ˜ ์ธ ๊ฒฝ์šฐ. ์ฆ‰, i-1 -> i๊ฐ€ ๋‚ด๋ฆฌ๋ง‰์ธ ๊ฒฝ์šฐ. ์ด๋•Œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋งŒ์•ฝ i-2 -> i-1์ด ์˜ค๋ฅด๋ง‰์ด์—ˆ๋‹ค๋ฉด i-2 -> i-1 -> i ๋Š” ์˜ค๋ฅด๋ง‰ -> ๋‚ด๋ฆฌ๋ง‰์œผ๋กœ ์‚ฐ์ด ํ˜•์„ฑ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— i-2 -> i-1 ์ด ํ‰์ง€, ๋˜๋Š” ๋‚ด๋ฆฌ๋ง‰์ธ ๊ฒฝ์šฐ๋งŒ ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

for (int i = 2; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			for (int k = 1; k < j; k++) {
				DP[j][i][0] += (DP[k][i - 1][0] + DP[k][i - 1][1] + DP[k][i - 1][2]);
				DP[j][i][0] %= mod;
			}
			DP[j][i][1] += (DP[j][i - 1][0] + DP[j][i - 1][1] + DP[j][i - 1][2]);
			DP[j][i][1] %= mod;
			for (int k = M; k > j; k--) {
				DP[j][i][2] += (DP[k][i - 1][1] + DP[k][i - 1][2]);
				DP[j][i][2] %= mod;
			}
		}
	}

๊ทธ๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„œํ•ด๋ณด๋ฉด ์ ํ™”์‹์€ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  N์ด ๋งŒ์•ฝ 1๋˜๋Š” 2๋ผ๋ฉด ์‚ฐ์ด ํ˜•์„ฑ๋  ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—

if (N == 1) {
	cout << M << "\n";
	return 0;
}
else if (N <= 2) {
	cout << M * M << "\n";
	return 0;
}

์ดˆ๊ธฐ์— ์˜ˆ์™ธ๋ฅผ ๊ฑธ์–ด์ฃผ์—ˆ๋‹ค.

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
#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 = INT_MAX;
const int MAX_N = 1000 + 5;
int N, M;
ll DP[105][MAX_N][3];
 
int main(void){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    if (N == 1) {
        cout << M << "\n";
        return 0;
    }
    else if (N <= 2) {
        cout << M * M << "\n";
        return 0;
    }
    for (int i = 1; i <= M; i++) {
        DP[i][2][0= i - 1;
        DP[i][2][1= 1;
        DP[i][2][2= M - i;
    }
    for (int i = 2; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            for (int k = 1; k < j; k++) {
                DP[j][i][0+= (DP[k][i - 1][0+ DP[k][i - 1][1+ DP[k][i - 1][2]);
                DP[j][i][0] %= mod;
            }
            DP[j][i][1+= (DP[j][i - 1][0+ DP[j][i - 1][1+ DP[j][i - 1][2]);
            DP[j][i][1] %= mod;
            for (int k = M; k > j; k--) {
                DP[j][i][2+= (DP[k][i - 1][1+ DP[k][i - 1][2]);
                DP[j][i][2] %= mod;
            }
        }
    }
    ll ans = 0;
    for (int i = 1; i <= M; i++) {
        ans += (DP[i][N][0+ DP[i][N][1+ DP[i][N][2]);
        ans %= mod;
    }
    cout << ans << "\n";
    return 0;
}
 
cs

 

728x90