추정

시간 제한5초메모리 제한128 MB

요약
배열을 k개의 연속 구간으로 나누고 각 구간을 하나의 상수로 대체할 때 절대 오차 합의 최솟값을 구한다. 0 0이 나올 때까지 여러 테스트 케이스를 처리한다.
난이도

보통10점 중 7점

유형
동적 계획법, 분할 정복, 정렬, 누적 합
정답자
아직 제출이 없습니다

문제

"여기 숫자가 너무 많잖아!" 상사가 소리칩니다. "이걸 어떻게 다 이해하라는 거야? 줄여! 추정해!"

애써 만든 숫자들이라 아쉽지만, 상사가 시키는 대로 하기로 합니다.

추정은 다음과 같이 합니다. 크기가 nn인 수열 AA가 주어지면, 이를 연속한 kk개의 구간으로 나눕니다. 각 구간의 크기가 서로 같을 필요는 없습니다. 그런 다음 각 구간 전체를 하나의 수로 추정합니다. 즉, 크기가 nn인 수열 AA로부터 크기가 nn인 또 다른 수열 BB를 만드는데, BB는 연속한 kk개의 구간으로 이루어지며 두 인덱스 ii와 jj가 같은 구간에 속하면 B[i]=B[j]B[i] = B[j]입니다. 목표는 오차, 즉 절댓값 차이의 합 ∑∣A[i]−B[i]∣\sum |A[i] - B[i]|를 최소화하는 것입니다.

입력

입력은 여러 개의 테스트 케이스로 이루어집니다. 각 테스트 케이스의 첫 줄에는 두 정수 nn (1≤n≤20001 \le n \le 2000)과 kk (1≤k≤251 \le k \le 25, k≤nk \le n)가 주어지며, nn은 수열의 크기이고 kk는 추정에 사용할 연속 구간의 개수입니다. 이어지는 nn개의 줄에는 각각 AA의 정수 원소가 하나씩 주어지며, 모든 원소는 −10000≤A[i]≤10000-10000 \le A[i] \le 10000을 만족합니다. 입력의 마지막 줄에는 두 개의 0이 주어집니다.

출력

각 테스트 케이스마다 한 줄에 정수 하나, 곧 달성할 수 있는 최소 오차를 출력합니다. 불필요한 공백을 출력하지 말고, 답과 답 사이에 빈 줄을 넣지 마십시오. 모든 답은 부호 있는 64비트 정수에 들어갑니다.

예제4

  1. 예제 1

    입력
    7 2
    6
    5
    4
    3
    2
    1
    7
    0 0
    
    예상 출력
    9
    
  2. 예제 2

    입력
    5 1
    1
    2
    3
    4
    5
    0 0
    
    예상 출력
    6
    
  3. 예제 3

    입력
    4 4
    10
    -10
    5
    3
    0 0
    
    예상 출력
    0
    
  4. 예제 4

    입력
    1 1
    5
    0 0
    
    예상 출력
    0