当前位置: 首页 > news >正文

CH5102 Mobile Service

CH5102 Mobile Service

描述

一个公司有三个移动服务员,最初分别在位置1,2,3处。
如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去。某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工。从 p 到 q 移动一个员工,需要花费 c(p,q)。这个函数不一定对称,但保证 c(p,p)=0。
给出N个请求,请求发生的位置分别为 p_1~p_N。公司必须按顺序依次满足所有请求,目标是最小化公司花费,请你帮忙计算这个最小花费。N≤1000,位置是1~200的整数。

输入格式

第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) ,并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。

输出格式

一个数M,表示最小服务花费。

  • 用f[i,x,y]表示一个员工完成了第i个订单,在ask[i]处,其余两个分别在x,y时的最小花费,注意:题目要求不能一个位置出现两名员工
  • 启发1:在确定DP状态时,要选择最小的能够覆盖整个状态空间的“维度集合”,若DP状态由多个维度构成,则应检查这些维度之间能否相互导出,用尽量少的维度覆盖整个状态空间,如本题中阶段i和两个员工的位置即可表示状态,另一个员工的状态可以直接得出。
  • 启发2:在转移时,如果总是从一个阶段转移到下一个阶段(本题从i到i+1),则没有必要关心附加信息维度的大小变化情况(本题x,y,p[i]前后大小变化不定),因为无后效性已经由“阶段”保证


  代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 int n,m;
 7 int c[210][210];
 8 int f[1005][205][205];
 9 int p[1005];
10 
11 int main()
12 {
13     scanf("%d%d",&n,&m);
14     for(int i=1 ; i<=n ; i++)
15         for(int j=1 ; j<=n ; j++)
16             scanf("%d",&c[i][j]);
17     for(int i=1 ; i<=m ; i++) scanf("%d",&p[i]);
18     memset(f,0x7f,sizeof(f));
19     f[0][1][2]=0,p[0]=3;
20     //初始化
21     for(int i=0 ; i<m ; i++) 
22         for(int x=1 ; x<=n ; x++)
23             for(int y=1 ; y<=n ; y++)
24             {
25                 int z=p[i];
26                 if(x==y||y==z||z==x) continue;
27                 if(p[i+1]!=x && p[i+1]!=y)
28                     f[i+1][x][y] = min(f[i+1][x][y],f[i][x][y]+c[z][p[i+1]]);
29                 if(p[i+1]!=x && p[i+1]!=z) 
30                     f[i+1][x][z] = min(f[i+1][x][z],f[i][x][y]+c[y][p[i+1]]);
31                 if(p[i+1]!=y && p[i+1]!=z) 
32                     f[i+1][y][z] = min(f[i+1][y][z],f[i][x][y]+c[x][p[i+1]]);
33             }
34             
35     int ans=0x7f7f7f7f;
36     for(int i=1 ; i<=n ; i++)
37         for(int j=1 ; j<=n ; j++)
38             ans=min(ans,f[m][i][j]);    
39     printf("%d\n",ans);    
40     return 0;
41 }
View Code

 

转载于:https://www.cnblogs.com/wmq12138/p/10365757.html

相关文章:

  • 区块链共识机制优缺点对比都是什么
  • Python数据可视化的10种技能
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • sql语句实战
  • 小程序微服务单个SSL证书部署多个项目解决方案
  • Async注解的使用,异步进行代码解耦
  • 我们在编写python代码时应该注意那几件事 !
  • Collection和Collections的区别是什么?
  • 根据出生日期计算年龄
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • centos7系统安装完成初始化
  • tkinter内嵌Matplotlib系列(一)之解读官网教材
  • SpringMvc4.0.0+Spring4.0.0+Mybatis3.2.7整合开发
  • js-时间戳转字符串
  • PYTHON2.day02
  • [NodeJS] 关于Buffer
  • leetcode388. Longest Absolute File Path
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • PHP面试之三:MySQL数据库
  • select2 取值 遍历 设置默认值
  • web标准化(下)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 区块链共识机制优缺点对比都是什么
  • 深度学习在携程攻略社区的应用
  • 一文看透浏览器架构
  • 硬币翻转问题,区间操作
  • ​2020 年大前端技术趋势解读
  • ​flutter 代码混淆
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #pragma once
  • (03)光刻——半导体电路的绘制
  • (06)金属布线——为半导体注入生命的连接
  • (20050108)又读《平凡的世界》
  • (独孤九剑)--文件系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ... 是什么 ?... 有什么用处?
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net 应用中使用dot trace进行性能诊断
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net流程开发平台的一些难点(1)
  • @Documented注解的作用
  • @取消转义
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [BT]BUUCTF刷题第4天(3.22)
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CSS]文字旁边的竖线以及布局知识
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?
  • [HDU3710]Battle over Cities
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]