比赛 动态规划练习赛1102 评测结果 AAAAAAAEEE
题目名称 地图着色 最终得分 70
用户昵称 ┭┮﹏┭┮ 运行时间 1.100 s
代码语言 C++ 内存使用 86.39 MiB
提交时间 2023-11-02 21:03:41
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 310;
typedef long long ll;
ll n,m;
ll a[N];
ll dp[N][N][110];
int find(int l,int r){
    ll ans = 0,mid = a[(l+r)>>1];
    for(int i = l;i <= r;i++)
        ans += abs(a[i] - mid);
    return ans;
}
int main(){
    freopen("map.in","r",stdin);
    freopen("map.out","w",stdout);
    memset(dp,0x3f,sizeof(dp));
    scanf("%lld%lld",&n,&m);
    for(int i = 1;i <= n;i++){
       scanf("%lld",&a[i]); 
       dp[i][i][1] = 0;
    }
    sort(a+1,a+1+n);
    for(int i = 1;i <= n;i++)
        for(int j = i;j <= n;j++){
            dp[i][j][1] = find(i,j);
        }
    for(int x = 2;x <= m;x++){
        for(int l = 1;l <= n;l++){
            for(int i = 1;i+l-1 <= n;i++){
                int j = i+l-1;
                for(int k = i;k < j;k++)dp[i][j][x] = min(dp[i][j][x],dp[i][k][x-1]+dp[k+1][j][1]);
            }
        }
    }
    printf("%lld\n",dp[1][n][m]);
    
    
    return 0;
    
}