ABOUT ME

Today
Yesterday
Total
  • 11058 크리보드
    알고리즘/백준 2019. 3. 21. 15:21

    1. 문제


    2. 코드


    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
    #include <queue>
    #include <iostream>
     
    using namespace std;
     
    int N;
    long dp[101];
     
    long solve(int n);
     
    int main()
    {
        scanf("%d"&N);
        printf("%ld", solve(N));
    }
     
    long solve(int n) {
        if (n <= 0)
            return 0;
        if (n == 1)
            return dp[n] = 1;
        if (dp[n] > 0)
            return dp[n];
     
        //A를 입력할 경우
        dp[n] = n;
        dp[n] = max(dp[n], solve(n - 1+ 1);
     
        //복붙할 경우
        int j = 2;
        //5번째전~ 3번째전꺼를 계속 붙여넣기했을 때 값 비교
        for (int i = n - 3; i > n - 6; i--) {
            //A를 입력할 경우와 비교
            dp[n] = max(dp[n], solve(i)*j);
            j++;
        }
        return dp[n];
    }
     
    cs


    3. 후기

    이 문제는 단순히 A를 추가하는 것과 복사붙여넣기 하는 것을 비교하는데 몇번째 전꺼를 복사 붙여넣기 하는지가 관건이다. 그래서 N-5일 때 드래그, 복사, 붙여넣기, 붙여넣기, 붙여넣기 이므로 solve(n-5)*2 부터 n-4, n-3까지 다 비교해본다 숫자가 커질수록 더 큰 수를 붙여넣기하지만, 붙여넣기하는 횟수는 적어지기 때문에 비교를 해서 큰 값을 리턴해주어야 한다. 


    출처 - https://stack07142.tistory.com/148

    '알고리즘 > 백준' 카테고리의 다른 글

    12865 평범한 배낭  (0) 2019.03.26
    11066 파일합치기  (0) 2019.03.25
    2294 동전 2  (0) 2019.03.19
    2293 동전 1 -DP  (0) 2019.03.19
    10942 팰린드롬?  (0) 2019.03.19
Designed by Tistory.