比赛 |
20111021 |
评测结果 |
AAAAAAAAAA |
题目名称 |
地图着色 |
最终得分 |
100 |
用户昵称 |
王者自由 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-10-21 19:12:56 |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
const int MAXN=3001, MAXM=11;
const int INF=0x7ffffff;
int n, m, i, j, k, p[MAXN];
int g[MAXN][MAXN], f[MAXN][MAXM];
inline int cmp(const void *a,const void *b){
return *(int*)a - *(int*)b;
}
int main() {
freopen("map.in","r",stdin);
freopen("map.out","w",stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++)
scanf("%d", &p[i]);
qsort(p+1, n, sizeof(p[0]), cmp);
for(i=0; i<=n; i++)
for(j=0; j<=m; j++)
f[i][j] = INF;
f[0][0] = 0;
for(j=1; j<=n; j++) {
g[j][j] = 0;
for(i=j-1; i>0; i--)
g[i][j] = g[i+1][j] + p[(i+j+1)/2] - p[i];
}
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
f[i][j] = INF;
for(k=0; k<=i-1; k++)
if (f[k][j-1] + g[k+1][i] < f[i][j])
f[i][j] = f[k][j-1] + g[k+1][i];
}
}
printf("%d\n", f[n][m]);
return 0;
}