题目描述:

  每组数据给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. U盘中了蠕虫病毒,文件夹都变成exe了,怎么办?

    昨天做实验,用U盘拷了实验室的文件,然后就中了病毒了(无奈),U盘里的文件全都变成了exe.有点慌张,我的U盘里存了很多课程资料.然而,我懒得下载杀毒软件.参考这位博主的做法,我成功的找回了我隐藏的文 ...

  2. 【转】python及其工具包安装基本流程

    昨天晚上在家里的旧电脑上安装了<利用python进行数据分析>的部分环境,遇到若干问题,在此予以记录. 部分细节转:http://blog.csdn.net/huanbia/article ...

  3. 【转】21个免费的UI界面设计工具、资源及网站

    本文将介绍21个免费的UI界面设计工具.资源及网站,如果你在做用户体验设计.界面设计.产品设计.JS前段开发.手机产品设计以及iPad和平板电脑产品设计,不妨来看看. AD: 2013云计算架构师峰会 ...

  4. MapGIS文件如何压缩存盘

    经过多次编辑修改的MapGIS数据,含有大量逻辑上已删除的节点或图元,数据冗余复杂, 在转换过程前应注意一定要采用压缩存盘方式处理,目的是确保编辑状态已删除的数据真正从物理存储层删除,以确保数据的精简 ...

  5. Educational Codeforces Round 80 D E

    A了三题,rk1000左右应该可以上分啦,开

  6. NOIP2004普及组第3题 FBI树

    /* 1106: NOIP2004普及组第3题 FBI树 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 9 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 我 ...

  7. CDQ 入门

    推荐博客 :https://blog.csdn.net/wu_tongtong/article/details/78785836 https://www.cnblogs.com/mlystdcall/ ...

  8. 所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了

    所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了

  9. windows下配置tomcat的虚拟路径编译器为IDEA

    在tomcat中配置好后发现运行项目还是无效 我们需要打开tomcat的配置,把下方的红色区域勾选上即可生效 具体原因如下 那是由于默认时IDEA的热部署机制,会在以下路径: [C:\Users\系统 ...

  10. python 继承机制(子类化内置类型)

    1. 如果想实现与某个内置类型具有类似行为的类时,最好的方法就是将这个内置类型子类化. 2. 内置类型子类化,其实就是自定义一个新类,使其继承有类似行为的内置类,通过重定义这个新类实现指定的功能. c ...