ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2229번 : 조 짜기
    알고리즘 공부 2020. 5. 7. 00:19

      혼자 생각해서 풀었더니 시간에 야무지게 초과해버려서 슬퍼하면서 검색을 했다. 와 역시 검색이 짱이야... 검색해서 나온 코드를 보고 내 방식대로 더 깔끔하게 수정해서 제출했다. 내가 참고한 블로그는 4ms였는데 나는 0ms 나왔으니까 내가 더 깔끔함! 암튼 그럼!


      풀이

      n개의 숫자가 주어졌을 때 적당히 그룹을 짓고 그룹 내에서 최대 최소의 차를 구한 것이 그룹의 점수이며 그룹 점수를 모두 더한 것이 dp의 정의다.

     

    dp[n] : n번째 숫자까지 최대 그룹 합

     

      마지막 숫자인 n번째 숫자가 포함된 그룹의 첫 번째 숫자가 전체 수열 중 j번째 숫자라고 하자. 이때 j는 최대 n이고 최소 1이다. 이때 dp [n]은 다음과 같이 계산할 수 있다.

     

    dp [n] = 그룹 점수 + dp [j-1]

     

      그룹은 j번째 수부터 n번째 수이기 때문에 해당 그룹에서 최대와 최소의 차를 계산해주면 된다.

     

    #include <iostream>
    
    using namespace std;
    
    int n;
    int seq[1002];
    int dp[1002];
    
    int main()
    {
        ios_base :: sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
        
        cin >> n;
    
        for(int i = 1; i <= n; i++)
        {
            cin >> seq[i];
        }
            
        for(int i = 2; i <= n; i++)
        {
            int low = 10004;
            int high = -1;
            
            for(int j = i; j >= 1; j--)
            {
                low = min(low, seq[j]);
                high = max(high, seq[j]);
                dp[i] = max(dp[i], high - low + dp[j-1]);
            }
        }
        
        cout << dp[n];
        
        return 0;
    }

    '알고리즘 공부' 카테고리의 다른 글

    백준 2616번 : 소형기관차  (0) 2020.05.09
    백준 2666번 : 벽장문의 이동  (0) 2020.05.07
    백준 2228번 : 구간 나누기  (1) 2020.05.05
    백준 1720번 : 타일 코드  (1) 2020.05.04
    백준 1695번 : 팰린드롬 만들기  (0) 2020.05.03
Designed by Tistory.