Algorithm/알고스팟

algospot - pi

jhg0406 2020. 2. 2. 20:11
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//algospot - pi
 
#include <iostream>
#include <vector>
using namespace std;
 
#define INF 100000
 
string s;
int len;
vector<int> cache;
int dp(int idx);
 
void init()
{
    cin >> s;
    len = s.size();
    cache = vector<int>(len, -1);
}
 
int case1(int start, int end)
{
    bool flag = true;
    for (int i = start; i < end++i)
        if (s[i] != s[i + 1])
            flag = false;
    if (flag)
        return 1 + dp(end + 1);
    else
        return INF;
}
 
int case2(int start, int end)
{
    int count = 0;
    for (int i = start; i < end++i)
        if (s[i] - s[i + 1== 1)
            ++count;
    if (count == end - start)
        return 2 + dp(end + 1);
    count = 0;
    for (int i = start; i < end++i)
        if (s[i] - s[i + 1== -1)
            ++count;
    if (count == end - start)
        return 2 + dp(end + 1);
    return INF;
}
 
int case3(int start, int end)
{
    if (end - start == 2)
        if (s[end== s[start])
            return 4 + dp(end + 1);
        else
            return INF;
 
    if (end - start == 3)
        if (s[start] == s[end - 1&& s[start + 1== s[end])
            return 4 + dp(end + 1);
        else
            return INF;
 
    if (s[start] == s[end&& s[start] == s[start + 2&& s[start + 1== s[end - 1])
        return 4 + dp(end + 1);
    return INF;
}
 
int case4(int start, int end)
{
    int gap = s[start + 1- s[start];
    int count = 0;
    for (int i = start + 1; i < end++i)
        if (s[i + 1- s[i] == gap)
            ++count;
    if (count == end - start - 1)
        return 5 + dp(end + 1);
    return INF;
}
 
int case5(int start, int end)
{
    return dp(end + 1+ 10;
}
 
int dp(int idx)
{
    if (idx == len)
        return 0;
    int &ret = cache[idx];
    if (ret != -1)
        return ret;
    ret = INF;
    for (int i = 2; i <= 4++i)
    {
        if (idx + i >= len)
            continue;
        ret = min(ret, case1(idx, idx + i));
        ret = min(ret, case2(idx, idx + i));
        ret = min(ret, case3(idx, idx + i));
        ret = min(ret, case4(idx, idx + i));
        ret = min(ret, case5(idx, idx + i));
    }
    return ret;
}
 
int main()
{
    int C;
    cin >> C;
    for (int tn = 0; tn < C; ++tn)
    {
        init();
        cout << dp(0<< "\n";
    }
}
 
cs

 

 

 

 

https://algospot.com/judge/problem/read/PI

 

algospot.com :: PI

원주율 외우기 문제 정보 문제 (주의: 이 문제는 TopCoder 의 번역 문제입니다.) 가끔 TV 에 보면 원주율을 몇만 자리까지 줄줄 외우는 신동들이 등장하곤 합니다. 이들이 이 수를 외우기 위해 사용하는 방법 중 하나로, 숫자를 몇 자리 이상 끊어 외우는 것이 있습니다. 이들은 숫자를 세 자리에서 다섯 자리까지로 끊어서 외우는데, 가능하면 55555 나 123 같이 외우기 쉬운 조각들이 많이 등장하는 방법을 택하곤 합니다. 이 때, 각 조각들의 난이

algospot.com

 

 

 

 

 

PI

DP문제

cache[i] : i번째부터 시작하는 원주율의 최소난이도를 저장합니다.