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处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个 ...
随机推荐
- 关于SQL关键字"having "
HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用. SQL HAVING 语法 SELECT column_name, aggregate_f ...
- 【Linux开发】linux设备驱动归纳总结(五):4.写个简单的LED驱动
linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- c++ | final
C++11的关键字final有两个用途:(1).禁止虚函数被重写:(2).禁止基类被继承. 在派生类中,可以同时使用overried和final.
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- Jenkins 启动不来的排查方法
1.通过 ps -ef | grep tomcat找到jenkins的路径,下有logs,可以查看日志 2.装插件报错时,报错信息里会提示依赖的插件版本号,到jenkins官网下载对应版本的插件即可, ...
- 新建项目报错'/Users/yanguobin/IdeaProjects/Demo/pom.xml' already exists in VFS
出现该情况的原因:是删除的时候并没有删除干净,点击如下位置会清除Idea的本地代码历史,然后重新创建项目就可以了
- HDU1251 统计难题(字典树|map
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分 ...
- table表格的无缝循环
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- USB键盘驱动分析
简介 本文介绍USB驱动程序编写的流程,分析一个键盘的USB程序,基于linux-2.6.39 USB驱动概要 分层 主机层面的USB驱动的整体架构可以分成4层,自顶到下依次是 1.USB设备驱动:本 ...
- redis 学习(1)-- redis 安装与启动
redis 学习(1)-- redis 安装与启动 redis 特性 关于 redis 的介绍网上已经有很多信息了,这里我就不在详细说明了.介绍一下几个鲜明特性: 1.速度快 官方称可以达到10W的q ...