1820: [JSOI2010]Express Service 快递服务

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 847  Solved: 325
[Submit][Status]

Description

「飞奔」快递公司成立之后,已经分别与市内许多中小企业公司签订邮件收送服务契约。由于有些公司是在同一栋大楼内,所以「飞奔」公司收件的地点(收件点)最多只有m点 (1, 2, …, m),因此「飞奔」仅先行采购了三辆货車并聘用了三名司机,每天早上分别从收件地点 「1」, 「2」 及 「3」出发。而在与客户的服务契约中有明确订约:「飞奔」必须在客户提出邮件寄送要求的隔天派人至该公司(地点)收件。 为了能更有效率的服务客户并节省收件时间,该公司设立了收件服务登记网站,客户如有邮件需要寄送,必须在需要收件的前一天就先上网登记。为了节省油量,「飞奔」就利用晚上先行安排三位司机隔天的收件路线。每位司机至各地点收件的顺序应与各公司上网登记的顺序相符且必须能在最省油的情况下完成当天所有的收件服务。因此每位司机有可能需要在不同时间重复到同一地点收件,或不同的司机有可能需在不同的时间点前往同一地点收件。 如下面范例二(收件公司地点依序为: 4 2 4 1 5 4 3 2 1)所示,虽然司机1一开始就已经在收件地点「1」了,但是他却不能先把后面第四个登记的公司(地点「1」)邮件先收了再前往第一、第二、或第三个登记收件地点(地点「4」,「2」,「4」)收件。但是如果前三个登记收件的服务是由司机2或3來负责,则司机1就可以在地点「1」收了第四个登记的邮件后再前往后面所登记的地点收件。此外,在某些情况下,不一定每辆车都要收到货,也就是說,最佳收件方式也有可能是只需出动一或兩辆车去收货。请写一个程序來帮「飞奔」公司计算每天依预约顺序至各收件地点收件的最少总耗油量。

Input

输入文件第一行有一个整数 m(3 < = m < = 200),代表「飞奔」公司收件的地点数,以1至m之间的整数代号來表示每个地点。 接下來的m行(第2到第m+1行),每行有m个整数,代表一个矩阵D。第 i +1行的第 j 个整数是D(i, j),D(i, j) 代表司机开车从收件点 i 到收件点 j 所需耗油量。最后有一行数串,数串之数字依序为前一天上网登记要求收件的公司地点代号,最多会有1000个收件请求。输入文件中任兩个相邻的整数都以一个空白隔开。 //D(i,j)<=maxint 注意:油量矩阵D满足三角不等式,也就是說 D(i, j) < = D(i, k) + D(k, j),1 < = i, j, k < = m。因此,每辆车前往下一个收件地点时一定是直接前往,不必先绕道至其它地点再抵达下个收件地点。

Output

输出一个整数,代表收件所需最少总耗油量。

Sample Input

4
0 5 0 6
6 0 5 6
1 6 0 6
1 1 1 0
1 1 1 1 4 4 2 2 2 3

Sample Output

6

样例说明:到每个请求收件地点的司机分别为1 1 1 1 3 3 2 2 2 1,因此司机1只需从起使点1移动到地点3,司机2只需停留在地点2,司机3从起始点3移动到地点4。

HINT

 

Source

JSOI2010第二轮Contest1

题解:b数组的第一个参数表示寄件的个数,另外两人就是第二第三个参数的最短路径,这样子Dp下去,不难转移(Ps:类比背包九讲里面压缩空间的方法,这里面dp时还是最好采取交替使用两个数组的方法——本程序里面分别为b[1]和b[0])

 var
i,j,k,l,m,n,p,t,ans:longint;
c:array[..,..] of longint;
b:array[..,..,..] of longint;
a:array[..] of longint;
function min(x,y:longint):longint;inline;
begin
if x<y then min:=x else min:=y;
end;
begin
readln(n);
for i:= to n do
begin
for j:= to n do
read(c[i,j]);
readln;
end;
fillchar(b,sizeof(b),);
b[,,]:=;
b[,,]:=;
a[]:=;
p:=;
t:=;
while not(eoln) do
begin
read(a[t]);
fillchar(b[p],sizeof(b[p]),);
for i:= to n do
for j:= to n do
begin
b[p,i,j]:=min(b[p,i,j],b[-p,i,j]+c[a[t-],a[t]]);
b[p,a[t-],j]:=min(b[p,a[t-],j],b[-p,i,j]+c[i,a[t]]);
b[p,a[t-],i]:=min(b[p,a[t-],i],b[-p,i,j]+c[j,a[t]]);
end;
p:=-p;
inc(t);
end;
readln;
ans:=maxlongint;
for i:= to n do
for j:= to n do
ans:=min(ans,b[-p,i,j]);
writeln(ans);
readln;
end.

最新文章

  1. 【转】封装原生JS实现Ajax
  2. [转]PhpStorm 超强语言模板的支持
  3. Dom的继承关系
  4. Android随笔之——Activity中启动另一应用
  5. XQuery的 value() 方法、 exist() 方法 和 nodes() 方法
  6. web之css伪类
  7. JPA一对多循环引用的解决
  8. Maven配置不成功
  9. express 手动删除session状态(即登出功能)
  10. touch事件学习
  11. VirtualBox虚拟机安装MSDOS和MINIX2.0.0双系统
  12. 使用APT减少MVP的冗余代码
  13. 关于HttpsURLConnection的连接问题
  14. 【转】文件读写NDK(或Linux)
  15. 用Update Select批量更新某一字段的值[可以跨库]
  16. CodeForces 22C System Administrator
  17. linux 消息队列例子
  18. hexo常用命令
  19. LVM 磁盘分区扩容
  20. docker~在centos容器中安装新程序

热门文章

  1. C语言中strcpy,strcmp,strlen,strcat函数原型
  2. DNS信息
  3. FMS4中的P2P功能
  4. LinkedHashMap遍历
  5. tomact配置域名和端口直接访问网站
  6. Linux 服务器设置成支持中文
  7. SQLServer2008开放windows防火墙配置
  8. 蓝桥网试题 java 基础练习 矩阵乘法
  9. input _文本框回车或者失去光标触发事件
  10. 关于JavaScript中的编码和解码函数