최적의 토너먼트

주어진 실력을 가진 N명의 참가자를 높이가 K 이하인 토너먼트 대진표의 리프에 배치해 모든 경기의 실력 차 합을 최소로 만든다.

어려움8동적 계획법정렬트리그리디아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

매년 열리는 프로그래밍 대회의 대진표를 짜려고 한다. 올해 대회에는 참가자 NN명이 나오고, 대회는 토너먼트 방식으로 치른다.

토너먼트는 잎 노드가 NN개인 이진 트리로 나타내고, 참가자를 잎 노드에 한 명씩 배정한다. 한 경기에서는 두 참가자가 맞붙어서 이긴 쪽이 다음 라운드로 올라가고 진 쪽은 탈락한다. 끝까지 살아남은 한 명이 우승자이고, 결승전은 트리의 루트 노드에 대응한다.

참가자 ii의 실력은 정수 AiA_i이다. 두 참가자가 맞붙으면 실력이 더 큰 쪽이 항상 이긴다. 실력이 같으면 승자는 무작위로 정해진다.

지난 대회에서는 한쪽으로 크게 기운 경기가 너무 많아 지루하다는 불만이 있었다. 그래서 경기의 지루함과 토너먼트의 지루함을 다음과 같이 정한다. 실력이 AiA_i인 참가자와 실력이 AjA_j인 참가자가 맞붙는 경기의 지루함은 두 실력의 차이 AiAj|A_i - A_j|이다. 토너먼트의 지루함은 트리에 있는 모든 경기의 지루함을 더한 값이다.

토너먼트의 높이가 KK 이하이기만 하면 균형이 맞지 않는 모양을 포함해 어떤 모양이든 쓸 수 있다. 토너먼트의 높이는 루트 노드에서 잎 노드까지 이어지는 단순 경로에 놓인 경기 수의 최댓값이다.

지루함의 최솟값을 구하는 프로그램을 작성하라.

그림 1. 첫 번째 예제에서 만들 수 있는 토너먼트 두 가지. 왼쪽은 높이가 2이고 오른쪽은 높이가 3이다.

입력

입력은 테스트 케이스 하나로 이루어지고, 형식은 다음과 같다.

N K
A_1 A_2 ... A_N

첫째 줄에 정수 NNKK가 주어진다. (2N10002 \le N \le 1000, 1K501 \le K \le 50) N2KN \le 2^K가 보장된다.

둘째 줄에 참가자의 실력 A1,A2,,ANA_1, A_2, \dots, A_N이 주어진다. (1Ai1000001 \le A_i \le 100000)

출력

높이가 KK 이하인 토너먼트 중에서 지루함이 가장 작은 값을 출력한다.