比赛 |
动态规划练习赛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;
}