SP703 SERVICE - Mobile Service[DP]

 

题意翻译

 

Description   一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。只有被请求后,他才能移动,不允许在同样的位置出现两个员工。从位置P到Q移动一个员工的费用是C(P, Q)。这个函数没有必要对称,但是C(P, P) = 0。一开始三个服务员分别在位置1,2,3,公司必须满足所有的请求。 目标是最小化公司的费用。 Input   第1行:2个整数L,N(3<=L<=200, 1<=N<=1000). L是位置数,每个位置从1到L编号,N是请求数。   接下来L行,每行包含L个非负整数,第i+1行的第j个数表示C(i, j),并且它小于2000.   最后一行包含N个数,是请求列表。 Output    第1行:一个数M,表示最小的服务花费

 

输入输出样例

 
输入样例#1: 
1
5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1
输出样例#1: 
5

解析:

这题值得好好理解。是我滚动数组入门题目。

容易想到以当前的请求作为阶段,当前服务员所在位置的最小花费作为状态。
首先,
四维数组会爆空间。不用滚动数组也会爆空间。。。

我们假设dp[i][x][y]表示在第i个请求时,有一个服务员在x位置,一个服务员在y位置。如果x和y都不在上一个请求所在位置,那么剩下那个服务员必定在上一个请求的位置那里。

我们有三种决策:
  • 将上一个请求位置的服务员转移到当前请求的位置上,前提是x和y都不在上一个请求所在位置;
  • 将x处的服务员转移到当前请求的位置上,前提是y处的服务员不在当前请求的位置上(注意:上一个请求位置上的服务员不可能在此处了,不需要此条件);
  • 将y处的服务员转移到当前请求的位置上,前提是x处的服务员不在当前请求的位置上;

我们很容易设计状态转移方程:

if(x!=p[i]&&y!=p[i])dp[now][x][y]=min(dp[now][x][y],dp[now^1][x][y]+a[p[i-1]][p[i]]);
if(y!=p[i])dp[now][p[i-1]][y]=min(dp[now][p[i-1]][y],dp[now^1][x][y]+a[x][p[i]]);
if(x!=p[i])dp[now][x][p[i-1]]=min(dp[now][x][p[i-1]],dp[now^1][x][y]+a[y][p[i]]);

当然,这些方程都有一个大前提,就是当前请求的x和y既不能在同一个位置上,又不能在上一个请求的位置上(注意细节)。

最后,我们检查一遍最后一个请求时的状态,找出最小值就OK了。

 

参考代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<string>
 7 #include<cstdlib>
 8 #include<queue>
 9 #include<vector>
10 #define INF 0x3f3f3f3f
11 #define PI acos(-1.0)
12 #define N 201
13 #define MOD 2520
14 #define E 1e-12
15 #define ri register int
16 using namespace std;
17 int a[N][N],dp[2][N][N],p[1001];
18 inline int read()
19 {
20     int f=1,x=0;char c=getchar();
21     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
22     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
23     return x*f;
24 }
25 int main()
26 {
27     int t;
28     cin>>t;
29     while(t--)
30     {
31         memset(a,0,sizeof(a));
32         memset(p,0,sizeof(p));
33         int now=0,l,n;
34         l=read(),n=read();
35         for(ri i=1;i<=l;i++)
36          for(ri j=1;j<=l;j++) a[i][j]=read();
37         for(ri i=1;i<=n;i++) p[i]=read();
38         memset(dp[now],0x3f,sizeof(dp));
39         p[0]=3;dp[0][1][2]=0;
40         for(ri i=1;i<=n;i++){
41             now^=1;//滚动数组
42             memset(dp[now],0x3f,sizeof(dp[now]));
43             for(ri x=1;x<=l;x++)//有l个地方可以去 
44                 if(x!=p[i-1])
45                     for(ri y=1;y<=l;y++)
46                     {    
47                         if(x==y&&y==p[i-1]) continue;
48                         if(x!=p[i]&&y!=p[i])
49                             dp[now][x][y]=min(dp[now][x][y],dp[now^1][x][y]+a[p[i-1]][p[i]]);
50                         if(y!=p[i])
51                             dp[now][p[i-1]][y]=min(dp[now][p[i-1]][y],dp[now^1][x][y]+a[x][p[i]]);
52                         if(x!=p[i])
53                             dp[now][x][p[i-1]]=min(dp[now][x][p[i-1]],dp[now^1][x][y]+a[y][p[i]]);
54                     }
55         }
56         int ans=INF;
57         for(ri i=1;i<=l;i++)
58          for(ri j=1;j<=l;j++) 
59           if(i!=j&&i!=p[n]&&j!=p[n])
60             ans=min(ans,dp[now][i][j]);//另一个人在p[n]处 
61         cout<<ans<<endl;
62     }
63     return 0;
64 } 

 

转载于:https://www.cnblogs.com/DarkValkyrie/p/11053352.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF758 D. Ability To Convert 细节处理字符串

link 题意&#xff1a;给定进制数n及一串数字,问在此进制下这串数能看成最小的数&#xff08;10进制&#xff09;是多少&#xff08;如HEX下 1|13|11 475&#xff09; 思路&#xff1a;此题要仔细思考细节。首先要想使数最小那么必定有个想法是使低位的数尽可能大即位数尽可能…

java 可能尚未初始化变量,java - 局部变量“变量”可能尚未初始化-Java - 堆栈内存溢出...

我得到这个错误。线程“主”中的异常java.lang.Error&#xff1a;未解决的编译问题&#xff1a;rgb2无法解析为变量它总是导致错误的rgb2数组。 如何解决这个问题呢&#xff1f;BufferedImage img1 ImageIO.read(file1);BufferedImage img2 ImageIO.read(file2);int w img1.…

leetcode1249. 移除无效的括号(栈)

给你一个由 ‘(’、’)’ 和小写字母组成的字符串 s。 你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ &#xff08;可以删除任意位置的括号)&#xff0c;使得剩下的「括号字符串」有效。 请返回任意一个合法字符串。 有效「括号字符串」应当符合以下 任意一条 要求&…

软件工程——个人课程总结

软件工程&#xff0c;我就是冲着软件这两个字来的&#xff0c;开始我觉得我们大多数人也是这样的&#xff0c;能开发一款属于自己的软件应该是我们人生中的第一个小目标八&#xff0c;在上学期学完java语言后&#xff0c;我们自认为自己已经具备了开发一款小软件的能力&#xf…

规则网络_实用的网络可访问性规则

规则网络by Tiago Romero Garcia蒂亚戈罗梅罗加西亚(Tiago Romero Garcia) 实用的网络可访问性规则 (Pragmatic rules of web accessibility that will stick to your mind) I first started to work with web accessibility back in 2015, at an American retail giant. It h…

8-python自动化-day08-进程、线程、协程篇

本节内容 主机管理之paramiko模块学习 进程、与线程区别python GIL全局解释器锁线程语法join线程锁之Lock\Rlock\信号量将线程变为守护进程Event事件 queue队列生产者消费者模型Queue队列开发一个线程池进程语法进程间通讯进程池 转载&#xff1a;  http://www.cnblogs.co…

部署HDFS HA的环境

> 环境架构部署规划&#xff1a; bigdata1 NameNode ResourceManager Zookeeper JournalNode failOverController bigdata2 NameNode ResourceManager Zookeeper JournalNode failOverController bigdata3 DataNode NodeManager Zookeeper bigdata4 DataNode NodeManager &g…

php layui 框架,Thinkphp5+Layui高颜值内容管理框架

Thinkphp5Layui高颜值内容管理框架TP5Layui高颜值内容管理框架&#xff0c;新增API模块Thinkphp5Layui响应式后台权限管理系统专注打造好用的框架&#xff0c;极速开发&#xff0c;高效灵活&#xff0c;从架构上兼顾系统复杂度的迭代与需求多变。代码结构清晰&#xff0c;接口开…

leetcode657. 机器人能否返回原点

在二维平面上&#xff0c;有一个机器人从原点 (0, 0) 开始。给出它的移动顺序&#xff0c;判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R&#xff08;右&#xff09;&#xff0c;L&#xff…

在Angular专家Dan Wahlin的免费33部分课程中学习Angular

According to the Stack Overflow developer survey 2018, Angular is one of the most popular frameworks/libraries among professional developers. So learning it increases your chances of getting a job as a web developer significantly.根据2018年Stack Overflow开…

select查询语句执行顺序

查询中用到的关键词主要包含六个&#xff0c;并且他们的顺序依次为 select--from--where--group by--having--order by 其中select和from是必须的&#xff0c;其他关键词是可选的&#xff0c;这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的&#xff0c;而是按照下面的…

Python的Virtualenv(虚拟环境)的使用(Windows篇)2

Python的Virtualenv(虚拟环境)的使用&#xff08;Windows篇&#xff09; 2018年04月13日 11:35:01 D_FallMoon 阅读数 771 版权声明&#xff1a;版权所有 装载请注明 …

Loadrunner常用15种的分析点

1.Vusers&#xff1a;提供了生产负载的虚拟用户运行状态的相关信息&#xff0c;可以帮助我们了解负载生成的结果。 2.Rendezvous&#xff08;负载过程中集合点下的虚拟用户&#xff09;&#xff1a;当设置集合点后会生成相关数据&#xff0c;反映了随着时间的推移各个时间点上并…

leetcode1442. 形成两个异或相等数组的三元组数目

给你一个整数数组 arr 。 现需要从数组中取三个下标 i、j 和 k &#xff0c;其中 (0 < i < j < k < arr.length) 。 a 和 b 定义如下&#xff1a; a arr[i] ^ arr[i 1] ^ … ^ arr[j - 1] b arr[j] ^ arr[j 1] ^ … ^ arr[k] 注意&#xff1a;^ 表示 按位异…

matlab的独立样本t检验,独立双样本检验的Matlab实现

Independent two-samples test in MatlabYang Runhuai1杨润怀(1987-)&#xff0c;男&#xff0c;讲师&#xff0c;生物3D打印Zhang Zhen1Yang Siqiao1Liang Zhen1梁振(1981-)&#xff0c;男&#xff0c;副教授&#xff0c;临床工程1、Life Science School, Anhui medical unive…

bi可视化工具_适用于您的BI解决方案的最佳数据可视化和Web报告工具

bi可视化工具通过智能数据分析使复杂变得简单 (Making the complex simple with smart data analysis) It is hard to overestimate the value of insightful analytics nowadays. All business processes have become data-driven: marketing, accounting, human resources, c…

Python os 属性(便于跨平台开发)

1、有助于跨平台开发的os模块属性 >>> tmp os.linesep >>> tmp \n >>> tmp os.sep >>> tmp / >>> tmp os.pathsep >>> tmp : >>> tmp os.curdir >>> tmp . >>> tmp os.pardir >&g…

第一个Hibernate项目

一、构建Hibernate项目 1.新建Java项目HibernateDemo1 2.导入Hibernate下的jar包&#xff08;lib->required下的所有jar包&#xff09;jdbc驱动包 3.导入hibernate.cfg.xml文件到src目录下&#xff08;在Hibernate文件目录中搜索*.cfg.xml&#xff09; 配置该文件如下&#…

前端面试常见逻辑题收集及分析

前端面试中常出现一些有趣的逻辑题,初见的时候有可能会手足无措,但实际多看几个题之后就会有一定的思考逻辑,有种打通任督二脉的感觉.以下是我个人面试经历以及网络上收集来的一些经典题目. 题目: 1.现有一个装有无限水的池塘,你手里有两个空壶,一个容积为6升,一个为5升,请问你…

php htaccess实现缓存,使用.htaccess进行浏览器图片文件缓存,_PHP教程

使用.htaccess进行浏览器图片文件缓存&#xff0c;对于图片类网站&#xff0c;每次打开页面都要重新下载图片&#xff0c;慢不说&#xff0c;还非常浪费流量。这时就需要用到缓存&#xff0c;强制浏览器缓存图片文件缓存文件&#xff0c;提问网站访问数度&#xff0c;减少流量消…