아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

리스트 자르기

면접 대비

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

요약
리스트를 연속된 K개 구간으로 나누어 각 구간의 최댓값과 최솟값 차이 합을 최소화합니다.
난이도

보통10점 중 5점

유형
동적 계획법, 구간
정답자
아직 제출이 없습니다

문제

정수 NN개로 이루어진 리스트 LL이 주어진다.

리스트 L={l1,l2,…,lN}L = \{l_1, l_2, \ldots, l_N\}을 인덱스 ii에서 자르면 비어 있지 않은 두 조각 {l1,…,li}\{l_1, \ldots, l_i\}과 {li+1,…,lN}\{l_{i+1}, \ldots, l_N\}으로 나뉜다. 이렇게 잘라 나온 조각을 다시 자르는 식으로 모두 K−1K - 1번 자르면 조각이 KK개 남고, 각 조각은 LL에서 연속한 원소로 이루어진다.

ii번째 조각의 최댓값을 MiM_i, 최솟값을 mim_i라 하고 di=Mi−mid_i = M_i - m_i로 정의한다.

ans=∑i=1Kdians = \sum_{i=1}^{K} d_i가 최소가 되도록 LL을 조각 KK개로 자르고, 그때의 ansans를 구하시오.

입력

첫째 줄에 테스트 케이스의 개수 TCTC가 주어진다 (1≤TC≤1201 \le TC \le 120).

각 테스트 케이스 앞에는 빈 줄이 하나 있다. 테스트 케이스의 첫째 줄에는 두 정수 NN과 KK가 주어진다 (1≤K≤N≤4001 \le K \le N \le 400). 둘째 줄에는 리스트 LL의 원소 NN개가 주어지며, 모두 10001000보다 작은 양의 정수다. LL의 원소가 서로 다르다는 보장은 없다.

출력

각 테스트 케이스마다 ansans를 한 줄에 출력한다.

힌트

L=8 1 5 4 7L = 8\ 1\ 5\ 4\ 7인 경우를 보자.

K=2K = 2면 {8}\{8\}과 {1,5,4,7}\{1, 5, 4, 7\}로 잘라 (8−8)+(7−1)=6(8 - 8) + (7 - 1) = 6이 된다. K=3K = 3이면 {8}\{8\}, {1}\{1\}, {5,4,7}\{5, 4, 7\}로 잘라 0+0+3=30 + 0 + 3 = 3이다. K=4K = 4면 {8}\{8\}, {1}\{1\}, {5,4}\{5, 4\}, {7}\{7\}로 잘라 0+0+1+0=10 + 0 + 1 + 0 = 1이다.

K=1K = 1이면 답은 리스트 전체의 최댓값에서 최솟값을 뺀 값이고, K=NK = N이면 조각마다 원소가 하나뿐이라 답은 00이다.

예제1

  1. 예제 1

    입력
    5
    
    5 1
    8 1 5 4 7
    
    5 2
    8 1 5 4 7
    
    5 3
    8 1 5 4 7
    
    5 4
    8 1 5 4 7
    
    5 5
    8 1 5 4 7
    
    예상 출력
    7
    6
    3
    1
    0