ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 교환 - 1039
    Algorithm/BOJ 2020. 3. 19. 17:53
    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
    //1039 - 교환
     
    #include <iostream>
    using namespace std;
     
    int N, K;
    int length;
    int cache[11][1000001];
     
    void init()
    {
        cin >> N >> K;
        string s = to_string(N);
        length = s.size();
        for(int i = 0; i<=K; ++i)
            for(int j = 0; j<1000001++j)
                cache[i][j] = -2;
     
    }
     
    int max(int u, int v)
    {
        if(v == -1return -1;
        return (u > v ? u : v);
    }
     
    int dp(int tries, int n)
    {
        if(tries == K) return n;
        int& ret = cache[tries][n];
        if(ret != -2)
            return ret;
        bool flag = true;
        for(int i = 0; i<length; ++i)
            for(int j = i+1; j<length; ++j)
            {
                string s = to_string(n);
                swap(s[i], s[j]);
                if(s[0== '0'
                {
                    swap(s[i], s[j]);
                    continue;
                }
                flag = false;
                n = stoi(s);
                ret = max(ret, dp(tries+1, n));
                swap(s[i], s[j]);
                n = stoi(s);
            }
     
        if(flag)
            return ret = -1;
        return ret;
    }
     
    int main()
    {
        init();
        cout << dp(0, N);
    }
    cs

     

     

     

     

     

     

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

     

    1039번: 교환

    첫째 줄에 정수 N과 K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, K는 10보다 작거나 같은 자연수이다.

    www.acmicpc.net

     

     

     

     

     

     

    교환

    재귀함수를 이용한 dp를 사용해 해결했습니다.

    C[u][v] : u번의 차례일때 숫자가 v일때, K번까지 작업을 완료했을때 최대값을 저장함

     

     

     

     

     

     

    'Algorithm > BOJ' 카테고리의 다른 글

    Scoring Hack - 17234  (0) 2020.03.20
    가운데를 말해요 - 1655  (0) 2020.03.19
    금강석 - 2496  (0) 2020.03.19
    보석 - 2492  (0) 2020.03.19
    게임 - 1103  (0) 2020.03.16

    댓글

Designed by Tistory.