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

[BOJ] #1509 ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ถ„ํ• 

by dar0m! 2021. 2. 9.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 2 ์ดˆ  128 MB 46.610%
 

1509๋ฒˆ: ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ถ„ํ• 

์„ธ์ค€์ด๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด์„ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ABACABA๋ฅผ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด, {A, B, A, C, A, B, A}, {A, BACAB, A}, {ABA, C, ABA}, {ABACABA}๋“ฑ์ด ์žˆ๋‹ค. ๋ถ„ํ• ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜

www.acmicpc.net

 

๋ฌธ์ œ

ํ•ด๊ฒฐ

key point, 'ํŒฐ๋ฆฐ๋“œ๋กฌ?' ๋ฌธ์ œ๋ฅผ ํ™œ์šฉ, d[i]๋Š” i๋ฒˆ์งธ๊นŒ์ง€ ๋ฌธ์ž์—ด์˜ ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ถ„ํ•  ์ตœ์†Ÿ๊ฐ’. DP
  • j๋ฒˆ์งธ ๋ถ€ํ„ฐ i๋ฒˆ์งธ๊นŒ์ง€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ €์žฅํ•œ ๋ฐฐ์—ด c[j][i]๋ฅผ ํ™œ์šฉํ•ด์„œ → ํŒฐ๋ฆฐ๋“œ๋กฌ? ๋ฌธ์ œ ํ™œ์šฉ
  • j~i๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋ผ๋ฉด → c[j][i] == true
    • d[i]๋Š” d[j - 1] + 1์ด๋‹ค.
    • d[j - 1]์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์กฐ๊ฑด๋ฌธ์ด ์ถ”๊ฐ€๋จ

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
8140 KB 36 ms
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
#include <iostream>
#include <string>
using namespace std;
bool c[2501][2501];
int d[2501];
int main() {
    string s;
    cin >> s;
    int n = s.size();
    s = " " + s;
    for (int i = 1; i <= n; i++)
        c[i][i] = true;
    for (int i = 1; i <= n - 1; i++) {
        if (s[i] == s[i + 1]) {
            c[i][i + 1= true;
        }
    }
    for (int k = 2; k < n; k++) {
        for (int i = 1; i <= n - k; i++) {
            int j = i + k;
            c[i][j] = (s[i] == s[j] && c[i + 1][j - 1]);
        }
    }
    d[0= 0;
    for (int i = 1; i <= n; i++) {
        d[i] = -1;
        for (int j = 1; j <= i; j++) {
            if (c[j][i]) {
                if (d[i] == -1 || d[i] > d[j - 1+ 1) {
                    d[i] = d[j - 1+ 1;
                }
            }
        }
    }
    printf("%d", d[n]);
    return 0;
}
cs

๋Œ“๊ธ€