ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • algospot - pi
    Algorithm/알고스팟 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번째부터 시작하는 원주율의 최소난이도를 저장합니다.

     

     

     

     

     

    'Algorithm > 알고스팟' 카테고리의 다른 글

    algospot - tiling2  (0) 2020.02.03
    algospot - quantize  (0) 2020.02.03
    algospot - jlis  (0) 2020.02.02
    algospot - lis  (0) 2020.02.02
    algospot - trianglepath  (0) 2020.02.02

    댓글

Designed by Tistory.