比赛 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;
}