题目描述:

  每组数据给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 ;
}

POJ_1485_dp的更多相关文章

随机推荐

  1. JAVA8学习——Stream底层的实现三(学习过程)

    Stream的深入(三) 心得:之前学习流,深入了流的底层.但是学的这些东西在平时日常开发的过程中,是根本不会用到的.只是为了更好帮助自己去理解流的底层设施.用起来也更自信,能够确定用的东西非常正确. ...

  2. Go合集,gRPC源码分析,算法合集

    年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...

  3. C++ | C++ 基础知识 | 类型与声明

    一.类型 C++ 包含一整套基本类型,这些类型对应计算机最基本的存储单元并且展现 1.0 布尔值 一个布尔变量(bool)的取值或者是 true 或者是 false,布尔变量常用于表达逻辑运算结果. ...

  4. Linux Cgroup浅析

    cgroup从2.6.4引入linux内核主线,目前默认已启用该特性.在cgroup出现之前,只能对一个进程做资源限制,比如通过sched_setaffinity设置进程cpu亲和性,使用ulimit ...

  5. 【转】在MyEclipse 8.6上搭建Android开发环境

    内容导航 第 1 页:基本环境准备 第 2 页:下载Android SDK 第 3 页:配置SDK环境变量 第 4 页:给MyEclipse安装ADT插件 第 5 页:配置MyEclipse 第 6 ...

  6. Java控制台五子棋(纯算法)

    Java五子棋小游戏 本方案是基于控制台写的一个代码 没有花里胡哨的界面,只为研究算法 仅仅用了200行代码 下面是的是运行结果 游戏运行结果 这里我就很简单的复制了一个结果 第9回合,下子方:玩家2 ...

  7. UGUI之MaskableGraphic

    MaskableGraphic继承自Graphic,并且继承了IClippable, IMaskable, IMaterialModifier三个接口.它是RawImage.Image和Text的父类 ...

  8. MongoDB Community 的安装和卸载

    MongoDB在他们的仓库中提供官方支持的包,该仓库包括以下软件包 mongodb-org:自动安装下面的四个组件安装包 a.mongodb-org-server:mongod的守护进程和相关的配置以 ...

  9. Java Linked集合的简单介绍和常用方法的使用

    LinkedList的简单介绍 java.util.LinkedList 集合数据存储的结构是链表结构.LinkedList是一个双向链表在实际开发中,对一个集合元素的添加和删除,经常涉及到首尾操作, ...

  10. APICloud打开三方地图整合

    一直想系统的整理打开地图的方法,今天抽时间把了百度,高德,腾讯,苹果自带地图都整理出来了,闲话不多说,直接上干货 ------------------------------------------- ...