比赛 |
动态规划练习赛1102 |
评测结果 |
MMMMMMMMMM |
题目名称 |
地图着色 |
最终得分 |
0 |
用户昵称 |
小金 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2023-11-02 21:59:18 |
显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
- long long f[3010][3010][11],a[3010];
- int n,m;
- long long qp(int l,int r)
- {
- long long s=0,p;
- if((r-l+1)^1)
- {
- int mid=(l+r)/2;
- p=a[mid];
- }
- else
- {
- int mid=(l+r)/2;
- p=(a[mid]+a[mid+1])/2;
- }
- for(int i=l;i<=r;i++)
- {
- s+=abs(a[i]-p);
- }
- return s;
- }
- int main()
- {
- freopen("map.in","r",stdin);
- freopen("map.out","w",stdout);
- memset(f,0x3f,sizeof(f));
- cin>>n>>m;
- for(int i=1;i<=n;i++)
- {
- cin>>a[i];
- }
- sort(a+1,a+n+1);
- for(int i=1;i<=n;i++)
- {
- for(int j=i;j<=n;j++)
- {
- f[i][j][1]=qp(i,j);
- //cout<<i<<' '<<j<<' '<<f[i][j][1]<<endl;
- }
- }
- for(int x=2;x<=m;x++)
- {
- for(int i=1;i<=n;i++)
- {
- for(int j=i;j<=n;j++)
- {
- for(int k=i;k<j;k++)
- {
- f[i][j][x]=min(f[i][j][x],f[i][k][x-1]+f[k+1][j][x-1]);
- }
- }
- }
- }
- cout<<f[1][n][m];
- return 0;
- }