题目描述:

  每组数据给n个点,点按一维坐标升序给出,要求划分成k块,在每一块中,取一个站,要求每个块中所有的点到站的距离的和的总和最小。

思路:

  dp题,dp[i][j]表示i个点分成j块的最小距离,每一个dp[i][j]可以由前面的dp[x][j-1]推出,其中j-1 <= x <= i-1,前面j-1个分块再加上后面一块,便形成了i个点j个划分,在所有符合条件的划分中取最小值,更新dp[i][j]的值。这样的思路,我们还需要一个方法计算一个块中的距离最小值。当一个块中点的数量为奇数时,取中点为站,则距离最小,当数量为偶数时,去中间两个点的任意一个,距离最小,所以我们可以用(left+right)/2表示一个区间中的那个站点。因为结果要求输出最小值的具体划分以及站点,还需要一个pos数组储存每种情况的划分边界。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define MAX 1<<30; int a[],dis[][],dp[][],pos[][][]; int main()
{
int n,K,num = ;
while(~scanf("%d%d",&n,&K) && n && K)
{
num++;
memset(pos,,sizeof(pos));
memset(dis,,sizeof(dis));
for(int i = ;i <= n;i++) scanf("%d",&a[i]);
for(int i = ;i <= n;i++)
{
dis[i][i] = ;
for(int j = i+;j <= n;j++)
{
int mid = (i+j)/;
for(int k = i;k < mid;k++) dis[i][j] += a[mid]-a[k];
for(int k = mid+;k <= j;k++) dis[i][j] += a[k]-a[mid];
}
}
for(int i = ;i <= n;i++)
{
dp[i][] = dis[][i];
pos[i][][i] = ;
for(int j = ;j <= i;j++) dp[i][j] = MAX;
}
for(int i = ;i <= n;i++)
{
for(int j = ;j <= min(i,K);j++)
{
for(int k = j-;k <= i-;k++)
{
int temp = dp[k][j-]+dis[k+][i];
if(temp < dp[i][j])
{
dp[i][j] = temp;
for(int l = ;l <= k;l++)
{
pos[i][j][l] = pos[k][j-][l];
}
pos[i][j][i] = ;
}
}
}
}
printf("Chain %d\n",num);
int now = ;
for(int i = ;i <= K;i++)
{
int left = now;
for(;!pos[n][K][now];now++);
int right = now++;
if (left == right)
{
printf("Depot %d at restaurant %d serves restaurant %d\n",i,left,left);
}
else
{
printf("Depot %d at restaurant %d serves restaurants %d to %d\n",i,(left+right)/,left,right);
}
}
printf("Total distance sum = %d\n\n",dp[n][K]); }
return ;
}

最新文章

  1. 1、Jsp页面
  2. Linux下错误的捕获:全局变量errno和strerror()
  3. 获取PC或移动设备的所有IP地址
  4. Many2one类型的fields Compute得到的值 搜索
  5. PHP 发送与接收流文件
  6. Swift开发第五篇——四个知识点(Struct Mutable方法&amp;Tuple&amp;autoclosure&amp;Optional Chain)
  7. Masonry 布局 cell 高度适应的一种方案(实现类似朋友圈简单布局)
  8. internet访问局域网内部方法之----------路由器端口映射
  9. 数据库升级ora-04063 DBMS_REGISTRY has error
  10. [ExtJS5学习笔记]第十三节 Extjs5的Ext.each方法学习
  11. vue中路由跳转的底层原理
  12. UCloud双11活动 - 新人UCloud代金券最低年100元香港云服务器
  13. linux五种I/O模型
  14. scrapy之管道
  15. React 入门学习笔记整理(五)—— state
  16. Redis Cluster日常操作命令梳理
  17. Access大数据高效分页语句
  18. android------eclipse运行错误提示 Failed to load D:\Android\sdk\build-tools\26.0.0-preview\lib\dx.jar
  19. Facebook 开源动画库 pop
  20. 一个hql语句

热门文章

  1. python利用scapy嗅探流量
  2. Java StringBuilder类
  3. vue vuex开发中遇到的问题及解决小技巧
  4. net 转 java
  5. Springboot引入本地jar时打包
  6. leetcode 最大水池
  7. windows下RocketMQ安装部署
  8. Ceph 之RGW Cache
  9. Dynamics email的subject标题出现 CRM:0000xxxx
  10. 矩阵matrix变换的用法(css3属性transform: matrix)