POJ_1485_dp
题目描述:
每组数据给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的更多相关文章
随机推荐
- linux条件变量使用和与信号量的区别
近来在项目中用到条件变量和信号量做同步时,这一块一直都有了解,但也一直没有总结,这次总结一下,给大家提供点参考,也给自己留点纪念. 首先,关于信号量和条件变量的概念可以自行查看APUE,我这直接把AP ...
- KnockoutJs官网教程学习(一)
这一教程中你将会体验到一些用knockout.js和Model-View-ViewModel(MVVM)模式去创建一个Web UI的基础方式. 将学会如何用views(视图)和declarative ...
- JS 通过url地址栏获取html页面名称
有的时候需要获取页面名称,为此我在这里封装了一个方. 一.分别根据传递不同的参数,获取到html页面的名称. 通过传递参数,获取到html页面的名称:参数params 以下是参数解释说明 (1)par ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前 ...
- nacos-docker安装nacos并配置数据库
拉取nacos/nacos-server镜像 docker pull nacos/nacos-server 配置数据库(MySQL) 创建存储nacos配置的数据库 create database n ...
- 《大道至简》第一章Java伪代码读后感
/*写程序,实际是一种方法论.从另外一个角度帮我们看待世界,看清事物的本质. 早在两千年前的寓言中,愚公和智叟的问答中就已体现整个工程的实现程序.*/ public class 移山{ string ...
- 使用telnet连接redis
平时连接redis用的是官方客户端redis-cli, 使用redis-cli最常用的几个参数如下: -h <hostname> Server hostname (default: 127 ...
- selenium常见的元素定位方法
一.获取元素 1)通过谷歌浏览器自动的工具访问百度首页,我们可以看到,页面上的元素都是由一行行的代码组成的,它们之间有层级地组织起来,每个元素之间都有不同的标签和值,我们可以通过这些不同的标签和值来找 ...
- 代码写不对队-Beta冲刺版本
代码写不对队:Beta冲刺版本 这个作业属于哪个课程 http://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework ...
- C#数字图像处理(十四)击中击不中变换 (Hit-miss)
击中击不中变换定义 击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分.显然,B1和B ...