[BOJ] 2011 : μνΈμ½λ
λ¬Έμ λ§ν¬
2011λ²: μνΈμ½λ (acmicpc.net)
2011λ²: μνΈμ½λ
λμ¬ μ μλ ν΄μμ κ°μ§μλ₯Ό ꡬνμμ€. μ λ΅μ΄ λ§€μ° ν΄ μ μμΌλ―λ‘, 1000000μΌλ‘ λλ λλ¨Έμ§λ₯Ό μΆλ ₯νλ€. μνΈκ° μλͺ»λμ΄ μνΈλ₯Ό ν΄μν μ μλ κ²½μ°μλ 0μ μΆλ ₯νλ€.
www.acmicpc.net
μνΈκ° μ£Όμ΄μ‘μ λ κ°λ₯ν ν΄μμ μλ₯Ό ꡬνλ λ¬Έμ .
νμ΄
μνλ²³ A~Zλ₯Ό 1~26μΌλ‘ μνΈν νκΈ°λ‘ νλ€. λμ΄μ°κΈ°κ° μλ€λ©΄ 1 1 κ³Ό 11μ ꡬλΆν μ μκ² μ§λ§ μνΈμ λμ΄μ°κΈ°κ° μκΈ° λλ¬Έμ μνΈκ° 11μ΄λΌκ³ νλ©΄ "AA"μ "K"λ‘ 2κ°μ§λ‘ ν΄μ κ°λ₯νλ€.
μ¬κΈ°μ μ£Όμν΄μΌ ν μ μ 0μ μλ¬΄λ° μνΈλ μλκΈ° λλ¬Έμ ν΄μμ΄ λΆκ°λ₯νλ€. κ·Έλ κΈ° λλ¬Έμ 10μ΄ λ€μ΄μ€λ©΄ 1 0 μΌλ‘ ꡬλΆν΄μλ ν΄μν μ μκ³ 10μΌλ‘ ν΄μν΄μΌνλ€.
κ·Έλ κΈ° λλ¬Έμ μ λ ₯μΌλ‘ 0 νλλ§ μ£Όμ΄μ§λ€λ©΄ ν΄μμ΄ λΆκ°λ₯ν μ½λμ΄λ―λ‘ 0 μ μΆλ ₯νκ³ μ’ λ£νλ©΄ λλ€.
μ무λλ κ° μ리μ μ«μλ₯Ό νλνλ λ΄μΌνκΈ° λλ¬Έμ int ν보λ€λ string νμΌλ‘ μ λ ₯λ°λ κ²μ΄ νΈνλ€.
λλ DPλ°°μ΄μ DP[μμμ ][λμ ] μΌλ‘ μ€μ ν΄μ μμμ λΆν° λμ μΈλ±μ€μ ν΄λΉνλ μνΈκ° ν΄μλ μ μλ κ²½μ°μ μλ₯Όμ μ₯ν΄ λμλ€.
25114
μμ 1μ μμλ‘ λ€μλ©΄ 0~1 μΈλ±μ€λ₯Ό 보면 "25"μ΄λ€ μ΄λ 2, 5λ‘λ ν΄μλ μ μκ³ 25λ‘λ ν΄μλ μ μκΈ° λλ¬Έμ
DP[0][1]μλ 2μ κ°μ μ μ₯ν΄ λμλ€. μ¬μ€ μΆλ°μ μ νμ 0μ΄κΈ° λλ¬Έμ DPλ₯Ό κ΅³μ΄ 2μ°¨μ λ°°μ΄λ‘ λ§λ€μ§ μμλ λμ§λ§ μ€κ°μ μμ΄λμ΄λ₯Ό λ°κΎΈκ² λΌμ μ½λλ₯Ό λ§μ΄ κ³ μΉμ§ μμΌλ € νλ€λ³΄λκΉ μ΄λ κ² λλ€.
DP[λ¬Έμμ΄μ κΈΈμ΄] λ‘ 1μ°¨μ λ°°μ΄λ‘ λ§λλκ² λ©λͺ¨λ¦¬ λ©΄μμλ λ ν¨μ¨μ μ΄κΈ° λλ¬Έμ μ’μ μ½λμ΄λ€.
0~2λ² μΈλ±μ€κΉμ§ μ¦ "251"μ λͺ¨λ κ²½μ°μ μλ‘ λλμ΄ λ³΄μ.
2 5 1, 25 1, 2 51 μ΄λ κ² 3κ°μ§κ° μλ€.
λΉ¨κ°μμΌλ‘ μΉ ν 2 5μ 25λ 0~1κΉμ§ λ΄€μ λ λμ¬ μ μλ κ²½μ°μ΄λ€.
μ΄λ‘μμΌλ‘ μΉ ν 2λ 0~0 κΉμ§ λ΄€μ λ λμ¬ μ μλ κ²½μ°μ΄λ€.
DP[0][2] λ DP[0][1] * DP[2][2] + DP[0][0] * DP[1][2] λ‘ λ³Ό μ μλλ° DP[1][2] λ DP[1][2] μ κ°μ κ·Έλλ‘ κ°κ³ μ€λ©΄ μλλ€. κ·Έλ λ€λ©΄?
μμμ μ’ν i μ λν΄ DP[0][i] = DP[0][i-1] * DP[i][i] + DP[0][i-2] * (i-1 ~ i λ μλ¦¬κ° μ체λ§μΌλ‘ μνΈκ° λ μ μλμ§?) λ‘ λ³Ό μ μλ€.
μ¬κΈ°μ λ΄μΌν μ μ λ€μ μμΈ DP[0][i-2] * (i-1 ~ i λ μλ¦¬κ° μ체λ§μΌλ‘ μνΈκ° λ μ μλμ§?) μ΄ λΆλΆμ΄λ€.
2 51 μ΄λ κ² λΆλ¦¬ν΄μ 보λ κ²½μ°μλ λ€μ 51μ 5 1λ‘ λλμ§ μκ³ 51 κ·Έ μμ²΄λ‘ μνΈλ‘ ν΄μλ μ μλμ§λ§ κ³ λ €νλ©΄ λλ€. λ¬΄μ¨ λ§μ΄λ νλ©΄ 2 51 μμλ 2 5 1 λ‘ λλλ κ²½μ°λ 2 5 1 μμ μ΄λ―Έ κ³ λ €λκΈ° λλ¬Έμ μκ°νμ§ μμλ λλ€.
κ·Έλ λ€λ©΄ 51μ 51 > 26 μ΄κΈ° λλ¬Έμ 51 μ체λ§μΌλ‘λ μνΈκ° λ μ μλ€. κ·Έλ κΈ° λλ¬Έμ λ€μ μμ 0μ΄ λλ€.
λ°λΌμ DP[0][2] = DP[0][1] * DP[2][2] = 2 * 1 = 2
DP[0][3]("2511") = DP[0][2] * DP[3][3] + DP[0][1] * (2 ~ 3 κΉμ§κ° μ체λ§μΌλ‘ μνΈκ° λ μ μλμ§?)μΈλ°
DP[0][2] = μμμ ꡬνλλ‘ 2μ΄κ³ DP[3][3] = 1μ΄λ€.
DP[0][1] = 2 μ΄κ³ λ€μ λμλ¦¬μΈ "11" μ <= 26 μ΄κΈ°λλ¬Έμ μ체λ§μΌλ‘ μνΈκ° λ μ μλ€.
λ°λΌμ DP[0][3] = 2 * 1 + 2 = 4 μ΄λ€.
κ·Έλ°λ° DP[i][i] λΌκ³ ν΄μ λ€ κ°μ΄ 1μΈ κ²μ μλλ€. i λ²μ§Έ μΈλ±μ€ κ°μ΄ '0' μ΄λΌλ©΄ DP[i][i] = 0 μ΄λλ€.
μ΄λ κ² ν΄μ DP[0][N-1] μ κ°μ μΆλ ₯ν΄μ£Όλ©΄ μ λ΅.
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
42
43
44
45
46
47
48
49
50
|
#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 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<int, int>, int>, vector<pair<pair<int, int>, int>>, greater<pair<pair<int, int>, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 5000 + 5;
int N;
int DP[MAX_N][MAX_N];
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string S;
cin >> S;
if (S.size() == 1 && S[0] == '0') {
cout << "0\n";
return 0;
}
for (int i = 0; i < S.size(); i++) {
if (S[i] == '0') {
continue;
}
DP[i][i] = 1;
}
for (int i = 0; i < S.size() - 1; i++) {
string temp = S.substr(i,2);
if (S[i] == '0') {
DP[i][i + 1] = 0;
continue;
}
else if (S[i + 1] == '0') {
if (stoi(temp) <= 26) {
DP[i][i + 1] = 1;
}
continue;
}
if(stoi(temp) <= 26)
DP[i][i + 1] = 2;
else DP[i][i + 1] = 1;
}
for (int i = 2; i < S.size(); i++) {
DP[0][i] = DP[0][i - 1] * DP[i][i];
if (DP[i - 1][i] == 1 && stoi(S.substr(i-1,2))<= 26) {
DP[0][i] += DP[0][i - 2];
}
else if(DP[i-1][i] == 2)DP[0][i] += DP[0][i - 2] * (DP[i-1][i] - 1);
DP[0][i] %= 1000000;
}
cout << DP[0][S.size() - 1]<< "\n";
return 0;
}
|
cs |