HDU 1227 Fast Food
2024-10-18 22:27:17
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1227
题意:一维坐标上有n个点,位置已知,选出k(k <= n)个点,使得所有n个点与选定的点中最近的点的距离总和最小,求出最小值。
思路:
将点i的距离记为为dis[i],从i到j选出一点使此段距离和最小,则此点坐标为dis[(i + j) / 2]
cost[i][j]为从i到j选出一点距离和的最小值。则求cost[i][j]的代码如下:
cost[i][j] = 0;
for(int k = i; k <= j; k++){
cost[i][j] += abs(dis[(i + j)/2] - dis[k]);
}
dp[i][j]表示从1到i选择j个点的最小值,则状态转移方程如下:
dp[i][j] = min(dp[k][j - 1] + cost[k + 1][i]) (j - 1 <= k <i)
代码如下,注意边界情况的处理,表示我也很头疼边界情况
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = ;
LL dp[N][], cost[N][N];
int dis[N];
int main(){
int n, m, cs = ;
while(~scanf("%d %d", &n ,&m) && n && m ){
for(int i = ; i <= n ; i++){
scanf("%d", &dis[i]);
}
memset(cost, 0x3F, sizeof(cost));
memset(dp, 0x3F, sizeof(dp));
for(int i = ; i <= n ; i++){
for(int j = i; j <= n ;j++){
cost[i][j] = ;
for(int k = i; k <= j; k++){
cost[i][j] += abs(dis[(i + j)/] - dis[k]);
} }
}
for(int i = ; i <= n; i++){
dp[i][] = cost[][i];
}
for(int j = ; j <= m ; j++){
for(int i = j; i <= n; i++){
for(int k = j - ; k < i; k++){
dp[i][j] = min(dp[i][j], dp[k][j - ] + cost[k + ][i]);
}
}
}
cs++;
printf("Chain %d\nTotal distance sum = %I64d\n\n",cs,dp[n][m]);
}
return ;
}
最新文章
- Vmware虚拟机Devstack安装openstack(All in one)
- [UML]UML系列——类图class的依赖关系
- Java 路径
- java中常用数据类型转换器
- LK 光流法简介
- 手机web下拉加载
- python css概述
- WebUploader上传文件(一)
- Core Erlang:Erlang的Core中间表示
- spring boot使用profile来区分正式环境配置文件与测试环境配置文件
- 【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障
- winfrom中pictureBox控件的部分使用方法
- t-io 集群解决方案以及源码解析
- 【20180111】【物流FM专访】贝业新兄弟李济宏:我们是如何做到大件家居B2C物流第一的?
- mysql5.7.21免安装版配置步骤
- OpenStack云桌面系列【2】—OpenStack和Spice
- Lambda模式
- GoLand(一)安装
- PHP API中,MYSQL与MYSQLI的持久连接区别
- IDEA配置toString方法