[bzoj1820][JSOI2010][Express Service 快递服务] (动态规划)

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

Solution

设计状态,令f[w][i][j][k]为处理完第w个请求后,三辆车分别在i\j\k三个点的最小耗油量

因为一定有一辆车正好停在点a[w],所以省掉一维空间,得到f[w][i][j]

因为这样做数组太大会超时(有一定联系),考虑每一次都由上一个请求转移到下一个请求,把w优化成滚动维

最后转移一下就行了

#include <stdio.h>
#include <memory.h>
#define MaxN 1001
#define MaxM 201
#define dmin(a,b) ((a)<(b)?(a):(b))
int g[MaxM][MaxM],a[MaxN],m,n,f[2][MaxM][MaxM],T,ans=0x3f3f3f3f;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&g[i][j]);
    while(scanf("%d",&a[++m])!=EOF);
    memset(f,0x3f,sizeof f);
    f[T][1][2]=f[T][2][1]=g[3][a[1]];
    f[T][2][3]=f[T][3][2]=g[1][a[1]];
    f[T][1][3]=f[T][3][1]=g[2][a[1]];
    for(int k=2;k<m;k++){
        T^=1; memset(f[T],0x3f,sizeof f[T]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                f[T][i][j]=f[T][j][i]=dmin(f[T][i][j],f[T^1][i][j]+g[a[k-1]][a[k]]);
                f[T][a[k-1]][j]=f[T][j][a[k-1]]=dmin(f[T][a[k-1]][j],f[T^1][i][j]+g[i][a[k]]);
                f[T][a[k-1]][i]=f[T][i][a[k-1]]=dmin(f[T][a[k-1]][i],f[T^1][i][j]+g[j][a[k]]);
            }
    }
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans=dmin(ans,f[T][i][j]);
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-24 19:14:55

[bzoj1820][JSOI2010][Express Service 快递服务] (动态规划)的相关文章

bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务

http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的最少耗油量 枚举第i个收件地点有哪个司机过来转移 N*M*M*M= 8e9 TLE&&MLE 压去一维,到第i个收件地点,一定有一个司机在第i个收件地点 N*M*M=4e7  MLE 滚动数组滚掉第一维 #include<cstdio> #include<cstring>

1820: [JSOI2010]Express Service 快递服务

1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 325[Submit][Status] Description 「飞奔」快递公司成立之后,已经分别与市内许多中小企业公司签订邮件收送服务契约.由于有些公司是在同一栋大楼内,所以「飞奔」公司收件的地点(收件点)最多只有m点 (1, 2, …, m),因此「飞奔」仅先行采购了三辆货車并聘用了三名司机,每天早上

【BZOJ1820】【JSOI2010】Express Service 快递服务 暴力DP

题解: 首先思考f[l][i][j][k],表示序列第l次,三个司机分别在i,j,k点时的最小花费 然后显然i.j.k的顺序无关紧要.. 然后显然i.j.k中有一个在序列第l项代表的位置. 然后我们可以缩掉一维 设序列第l项为to[l], 则状态变成f[i][j][k]表示三个司机分别在to[i],j,k. 因为顺序无关紧要,所以我们还可以定义j恒<=k来卡常数. 然后1000的立方空间太大. 简单分析发现状态转移允许使用滚动数组. 所以再滚动一下. 最后空间复杂度O(n^2), 瓶颈在于路径长

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

张书乐:人民日报发声力挺京东 快递服务让市场评判

7月26日的<人民日报>上颇为罕见的在评论.政治2个版面上,用2篇时评+1篇新闻的组合(分别是<加速补齐快递业的治理短板(人民时评)>.<服务质量多听市场意见>和<快递立法,破解成长的烦恼>),对快递业乱象进行评论和报道,而这或许是可能成为一场有关快递服务质量的引爆点,而随后可能带来更大范围的快递业行业规范的大整顿. <人民日报>密集点评快递业,是有缘由的 同时,不容忽视的是,就在7月20日,京东宣布7月31日起暂停天天快递服务.此后,苏宁物流高

android基础部分再学习---再谈Service进程服务通信

Bound Services 快速查看 bound服务允许被其它控件绑定,以便与之交互并进行进程间通信 一旦所有的客户端都解除了绑定,bound服务将被销毁.除非该服务同时又是started类型的. 在本文中(参见目录) 关键类 Service ServiceConnection IBinder 范例 RemoteService LocalService bound服务是客户端-服务器模式的服务.bound服务允许组件(比如activity)对其进行绑定.发送请求.接收响应.甚至进行进程间通信(

keychain service钥匙串服务

keychain service钥匙串服务是iOS提供的用于管理用户密码.密钥.证书.标识的服务,它相当于一个加密容器,app可以把相关的用户信息以钥匙条目的形式存储到其中,钥匙串服务会将所有存储到其中的条目进行加密,并保护起来,只允许创建这个条目的app访问它. app要把用户信息(钥匙)添加到钥匙串服务(钥匙串)中,在必要时从钥匙串服务中取出用户信息,这些动作需要用到Keychain Services API.Keychain Services API的相关属性和方法声明在< Securit

spring boot配置service发布服务

在application.yml中配置 server: port: 8080 context-path: /crm spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/crm username: root password: 136735 jpa: show-sql: true jackson: default-property-inclusion: non_n

Docker Kubernetes Service 网络服务代理模式详解

Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注:kubernetes deployment服务分配服务器负载均衡VIP只能NODE节点单独访问,这里需要外网用户可以放问到容器内,这里就需要用到service. 网络代理模式 kube-proxy v1.0中只支持userspace模式,在v1.1中,添加了iptables代理,在v1.2开始ip