求邦邦,样例都没过。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 3005;
ll n, m, a[N];
ll f[N][N], dp[N][305], s[N][305];
void init(){
memset(dp, 127, sizeof dp);
// dp[0][0] = 0;
for(int i = 1; i <= n; i++) s[i][0] = 1, dp[i][1] = f[1][i];
// cout << f[1][n] << endl;
for(int j = 1; j <= m; j++) s[n + 1][j] = n - 1;
}
int main (){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++)
f[i][j] = f[i][j - 1] + (a[j] - a[(i + j)/2]);
}
init();
for(int j = 1; j <= m; j++) {
for(int i = n; i >= 1; i--) {
for(int k = s[i][j - 1]; k <= s[i + 1][j]; k++)
if(dp[k][j - 1] + f[k + 1][j] < dp[i][j]){
dp[i][j] = dp[k][j - 1] + f[k + 1][j];
s[i][j] = k;
}
if(dp[i][j] == 0)cout << i << " " << j << endl;
}
}
printf("%d", dp[n][m]);
return 0;
}