CH5102/SPOJ?? Mobile Service/P4046 [JSOI2010]快递服务[线性dp+卡常]
终于会做一道了。。
$f[i][j][k]$表示第$i$个命令后一个人在$j$,另一个在$k$,还有一个在哪你懂得。(其实这里是一个状态精简,第三个人的状态没必要留,因为可以知道)
于是每个操作枚举上一次两个人分布位置,排除一下站同一位置的,三个人里面选一个推过来。采用前推法(←我瞎起的名字2333)dp。状转的话看code里面三行好了。
EFFECTIVE SKILLS
很好写。但是比较卡常。一些细节优化:
- $f[2][N][N]$滚动。基本操作,优化空间。另外,在这题里面(或者说很多题中也)可以顺便优化时间。清INF的操作就可以不用了。原理是每次枚举i^1的两个人位置的时候由于这两个人位置状态枚举掉后不会再看了,而下一次再用i^1这一维的时候有要求有初始最大值方便更新,所以我现在推完立即就把i^1这一维设为INF。下次就不清INF了。时间就会极大减少。注意顺带清INF操作放在判断(line32)外面(其实是因为不想去想重叠的情况什么的了,统统初始化算了)
- 枚举j和k时,可以缩小范围,只枚举j<k的情况,枚举数量少一半。
然后轻松刷榜rank1。
现在看来上面的话过于睿智,请无视。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<queue>
- #define dbg(x) cerr<<#x<<" = "<<x<<endl
- #define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
- using namespace std;
- typedef long long ll;
- template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
- template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
- template<typename T>inline T _min(T A,T B){return A<B?A:B;}
- template<typename T>inline T _max(T A,T B){return A>B?A:B;}
- template<typename T>inline T read(T&x){
- x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
- while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
- }
- const int N=+,M=+,INF=0x3f3f3f3f;
- int dis[N][N],p[M],f[][N][N];
- int m,n,ans;
- int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
- read(n),read(m);
- for(register int i=;i<=n;++i)for(register int j=;j<=n;++j)read(dis[i][j]);
- for(register int i=;i<=m;++i)read(p[i]);
- memset(f,INF,sizeof f);ans=INF;
- f[][][]=dis[][p[]],f[][][]=dis[][p[]],f[][][]=dis[][p[]];
- for(register int i=,l=;i<=m;++i,l^=){
- for(register int j=;j<n;++j)
- for(register int k=j+;k<=n;++k){
- if((j^p[i-])&&(k^p[i-])){
- MIN(f[l][j][k],f[l^][j][k]+dis[p[i-]][p[i]]);
- p[i-]<k?MIN(f[l][p[i-]][k],f[l^][j][k]+dis[j][p[i]]):MIN(f[l][k][p[i-]],f[l^][j][k]+dis[j][p[i]]);
- p[i-]<j?MIN(f[l][p[i-]][j],f[l^][j][k]+dis[k][p[i]]):MIN(f[l][j][p[i-]],f[l^][j][k]+dis[k][p[i]]);
- }
- f[l^][j][k]=INF;
- }
- }
- for(register int i=;i<=n;++i)if(i^p[m])for(register int j=i+;j<=n;++j)if(j^p[m])MIN(ans,f[m&][i][j]);
- printf("%d\n",ans);
- return ;
- }
CH5102/SPOJ?? Mobile Service/P4046 [JSOI2010]快递服务[线性dp+卡常]的更多相关文章
- P4046 [JSOI2010]快递服务
传送门 很容易想出\(O(n^3m)\)的方程,三维分别表示某个快递员现在在哪里,然后直接递推即可 然而这样会T,考虑怎么优化.我们发现每一天的时候都有一个快递员的位置是确定的,即在前一天要到的位置. ...
- 【BZOJ1820】[JSOI2010]快递服务(动态规划)
[BZOJ1820][JSOI2010]快递服务(动态规划) 题面 BZOJ 洛谷 题解 考虑无脑四维\(dp\).\(f[i][a][b][c]\),表示当前处理到第\(i\)个任务,三辆车的位置分 ...
- 【BZOJ1820】[JSOI2010]Express Service 快递服务 暴力DP
[BZOJ1820][JSOI2010]Express Service 快递服务 Description 「飞奔」快递公司成立之后,已经分别与市内许多中小企业公司签订邮件收送服务契约.由于有些公司是在 ...
- [JSOI2010]快递服务
Description Luogu4046 BZOJ1820 Solution 暴力DP很好想,\(f[i][j][k][l]\)表示处理到第\(i\)个任务,三个人在\(i,j,k\)的方案数.显然 ...
- BZOJ 1820: [JSOI2010]Express Service 快递服务( dp )
dp(i,j,k)表示在处理第i个业务, 另外2个在j,k处. 第一维可以滚动... --------------------------------------------------------- ...
- 1820: [JSOI2010]Express Service 快递服务
1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 847 Solved: 325 ...
- bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务
http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的 ...
- CH5102 Mobile Service
CH5102 Mobile Service 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去.某一时刻只有一 ...
- CH5102 Mobile Service【线性dp】
5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个 ...
随机推荐
- 微信小程序页面左右滑动事件
微信小程序提供了页面的上下滚动的事件,在页面的js文件中, page({ onPageScroll(e) { console.log(e.scrollTop) } }) 但是不是滑动事件,滑动事件需要 ...
- PHP-T
TP5目录结构 ├─application 应用目录 ├─extend 扩展类库目录(可定义) ├─public 网站对外访问目录 ├─runtime 运行时目录(可定义) ├─vendor 第三方类 ...
- 云计算Openstack介绍(1)
一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...
- 【linux杂谈】遇到REMOTE HOST IDENTIFICATION HAS CHANGED怎么办?
今日遇到如下问题: 警告的大概意思就是,主机密钥发生变更,并提示安全风险(可能存在中间人攻击) 但是事实是,这是因为我重装系统之后遇到的问题.重装系统后,指纹当然会发生变化了...在Xshell实验中 ...
- 非常好的一个JS代码(CJL.0.1.js)
/*! * Cloudgamer JavaScript Library v0.1 * Copyright (c) 2009 cloudgamer * Blog: http://cloudgamer.c ...
- MSF魔鬼训练营-3.5.3 MSF中常用的关于数据库的命令
渗透测试数据库用来保存渗透测试过程中获取的各种数据,很多时候你重启了kali发现连接不上数据库了,其实就是因为这个服务没开 MSF所使用的数据库时postgresql root@kali:/# ser ...
- JDK下bin文件夹常见几个可执行文件
bin目录下有很多的可执行文件: java.exe:运行Java程序,就是启动JVM,让JVM执行指定的编译后的代码: javac.exe:Java的编译器,它用于把Java源码文件(以.java后缀 ...
- python 学习笔记三 (函数)
1.把函数视为对象 def factorial(n): '''return n!''' return 1 if n < 2 else n*factorial(n-1) print(factori ...
- Mysql binlog应用场景与原理深度剖析
1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他M ...
- Chrome的cookie放在哪里了,Cookie/Session机制详解
Chrome的cookie放在哪里了,Cookie/Session机制详解:https://blog.csdn.net/u010002184/article/details/82082951