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

BZOJ1820:[JSOI2010]Express Service 快递服务(DP)

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。

Solution

sbDP,基本相当于昨晚上nowcoder的弱化版
因为一个地方j和k写反调了半天……GG
考虑裸暴力,f[num][i][j][k]表示当前完成了第num个收件点,三辆车分别在ijk三个位置
很容易发现ijk可以优化掉一维因为一定有一辆车在上一个收件点a[num-1]
再滚动数组优化一下第一维就可以过了,f[0/1][i][j]表示一辆车在i,一辆在j。复杂度m*n^2

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define N (205)
 5 using namespace std;
 6 int f[2][N][N],dis[N][N],a[N*5],n,m,x,pre=0,now=1;
 7 int main()
 8 {
 9     memset(f,0x3f,sizeof(f));
10     scanf("%d",&n);
11     for (int i=1; i<=n; ++i)
12         for (int j=1; j<=n; ++j)
13             scanf("%d",&dis[i][j]);            
14     while (scanf("%d",&x)!=EOF) a[++m]=x;
15     
16     f[0][1][2]=f[0][2][1]=dis[3][a[1]];
17     f[0][2][3]=f[0][3][2]=dis[1][a[1]];
18     f[0][1][3]=f[0][3][1]=dis[2][a[1]];
19     
20     for (int i=2; i<=m; ++i)
21     {
22         memset(f[now],0x3f,sizeof(f[now]));
23         for (int j=1; j<=n; ++j)
24             for (int k=1; k<=n; ++k)
25             {
26                 f[now][j][k]=f[now][k][j]=min(f[now][j][k], f[pre][j][k]+dis[a[i-1]][a[i]]);
27                 f[now][a[i-1]][j]=f[now][j][a[i-1]]=min(f[now][j][a[i-1]], f[pre][j][k]+dis[k][a[i]]);
28                 f[now][a[i-1]][k]=f[now][k][a[i-1]]=min(f[now][k][a[i-1]], f[pre][j][k]+dis[j][a[i]]);
29             }
30         pre^=1; now^=1;
31     }
32     
33     int ans=0x7fffffff;
34     for (int i=1; i<=n; ++i)
35         for (int j=1; j<=n; ++j)
36             ans=min(ans,f[pre][i][j]);
37     printf("%d",ans);
38 }

转载于:https://www.cnblogs.com/refun/p/9310617.html

相关文章:

  • nginx的proxy_cache缓存配置
  • 打包Scala jar 包的正确步骤
  • docker python 配置
  • scala函数和方法的差别
  • 新CIO:Mark Schwartz认为的领先IT
  • 论文笔记:Variational Capsules for Image Analysis and Synthesis
  • 与 TensorFlow 的初次相遇
  • npm怎么配置下包最神速?
  • Docker折腾记: (1)构建yapi容器,从构建发布到可用
  • 新形式下触电新闻如何打造内容安全领域新标杆
  • 3.保安队的日子(下)我当程序员的那些事1
  • python3+selenium入门04-元素定位
  • RocketMQ概述
  • Go 语言的垃圾回收演化历程:垃圾回收和运行时问题
  • 第八课-第一讲 08_01_facl及用户及Linux终端
  • 网络传输文件的问题
  • 【EOS】Cleos基础
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • android图片蒙层
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Bootstrap JS插件Alert源码分析
  • es的写入过程
  • gulp 教程
  • JAVA多线程机制解析-volatilesynchronized
  • JS变量作用域
  • JS函数式编程 数组部分风格 ES6版
  • leetcode98. Validate Binary Search Tree
  • Python打包系统简单入门
  • sessionStorage和localStorage
  • win10下安装mysql5.7
  • 关于使用markdown的方法(引自CSDN教程)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 设计模式 开闭原则
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 赢得Docker挑战最佳实践
  • # 数论-逆元
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #git 撤消对文件的更改
  • (2015)JS ES6 必知的十个 特性
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Java数据结构)ArrayList
  • (Matlab)使用竞争神经网络实现数据聚类
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (全注解开发)学习Spring-MVC的第三天
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .Net多线程总结
  • .NET项目中存在多个web.config文件时的加载顺序