CH 5102 Mobile Service(线性DP)
CH 5102 Mobile Service

$ solution: $
这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求。所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有点大,而且我们需要记录三个人的位置信息。但是我们可以发现完成一个请求时三个人中必然有一人在这个请求的位置,所以我们可以根据请求来判断其中一人的位置,这样我们就只需要记录其他两个人了。而复杂度似乎刚好够用。
设 $ F[i][j][k] $ 表示已经处理完第 $ i $ 个请求,且另外两个人分别在 $ j $ 和 $ k $ 的的最小花费,然后我们可以用这个状态向后转移:
if(j!=a[i+1]&&k!=a[i+1])f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+d[a[i]][a[i+1]]);
if(a[i]!=a[i+1]&&k!=a[i+1])f[i+1][a[i]][k]=min(f[i+1][a[i]][k],f[i][j][k]+d[j][a[i+1]]);
if(a[i]!=a[i+1]&&j!=a[i+1])f[i+1][a[i]][j]=min(f[i+1][a[i]][j],f[i][j][k]+d[k][a[i+1]]);
需要注意题目说了不能有两个人在同一个位置!
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int m,n,ans;
int a[1005];
int d[205][205];
int f[1003][203][203];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
m=qr(); n=qr(); a[0]=1;
for(rg i=1;i<=m;++i)
for(rg j=1;j<=m;++j)
d[i][j]=qr();
for(rg i=1;i<=n;++i) a[i]=qr();
for(rg i=0;i<=n;++i)
for(rg j=1;j<=m;++j)
for(rg k=1;k<=m;++k)
f[i][j][k]=1e7;
f[0][2][3]=0;
for(rg i=0;i<n;++i){
for(rg j=1;j<=m;++j){
for(rg k=1;k<=m;++k){
if(f[i][j][k]<1e7){
if(j!=a[i+1]&&k!=a[i+1])f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+d[a[i]][a[i+1]]);
if(a[i]!=a[i+1]&&k!=a[i+1])f[i+1][a[i]][k]=min(f[i+1][a[i]][k],f[i][j][k]+d[j][a[i+1]]);
if(a[i]!=a[i+1]&&j!=a[i+1])f[i+1][a[i]][j]=min(f[i+1][a[i]][j],f[i][j][k]+d[k][a[i+1]]);
}
}
}
} ans=1e7;
for(rg i=1;i<=m;++i)
for(rg j=1;j<=m;++j)
ans=min(ans,f[n][i][j]);
printf("%d\n",ans);
return 0;
}
CH 5102 Mobile Service(线性DP)的更多相关文章
- [tyvj 1061] Mobile Service (线性dp 滚动数组)
3月15日第一题! 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须 ...
- CH5102 Mobile Service【线性dp】
5102 Mobile Service 0x50「动态规划」例题 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个 ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
- 『最长等差数列 线性DP』
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...
- cf909C 线性dp+滚动数组好题!
一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...
- 2018.09.21 codeforces1051D. Bicolorings(线性dp)
传送门 sb线性DP. f[i][j][0/1/2/3]f[i][j][0/1/2/3]f[i][j][0/1/2/3]表示前i列j个连通块且第i列状态为00/01/10/11时的方案总数. 这个显然 ...
- CH5102 Mobile Service
CH5102 Mobile Service 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去.某一时刻只有一 ...
- CH 5302 金字塔(区间DP)
CH 5302 金字塔 \(solution:\) 很神奇的一道题目,当时看到还以为是一道字符串求回文子串的题目.但是数据范围很小,而且只知道回文串也不好做.但是我们观察可得,如果是深度搜索便利,那么 ...
- CH 5105 Cookies(贪心+DP)
\(CH 5105 Cookies\) \(solution:\) 真是好题一道!这道题我想了很久很久,就得这一题可以直接完全贪心,可惜最后还是失败了,但是对贪心的深入思考也换来了一个最优解方案.然后 ...
随机推荐
- 刷题总结——烽火传递(单调队列+dp)
题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...
- P2085 最小函数值 (堆)
题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix^2+Bix+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...
- VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
引用链接:1)http://www.it165.net/os/html/201401/7063.html 2)http://www.cnblogs.com/sineatos/p/4489620.htm ...
- cf682E Alyona and Triangles
You are given n points with integer coordinates on the plane. Points are given in a way such that th ...
- Codeforces Round #278 (Div. 2) B. Candy Boxes [brute force+constructive algorithms]
哎,最近弱爆了,,,不过这题还是不错滴~~ 要考虑完整各种情况 8795058 2014-11-22 06:52:58 njczy2010 B - Ca ...
- Bruce Eckel:编程生涯
大家总是问一个错误的问题:“我应该学习C++还是Java?”在本文中,我将告诉大伙儿:对于选择编程生涯真正需要关注的是哪些问题. 请注意,这篇文章的目标读者并不是那些已经做出自己选择的人.(对于这些人 ...
- mysql 5.7版本目录无data文件夹的解决办法
安装mysql 5.7+版本时,若发现因根目录下,缺少data文件夹的情况, ***请不要去拷贝其他版本的data文件夹!*** 因为此操作会出现很多潜在问题:比如我遇到的执行show variabl ...
- MySQL的内存表(转)
说明:MySQL内存表可以提升一些临时业务的查询,比如做Session的共享,一些类似缓存的数据等. “内存表”顾名思义创建在内存中的表,真是这样吗?其实不然,MySQL的内存表,表结构创建在磁盘上, ...
- ArcCatalog中通过ArcSDE向Oracle数据库中导入数据
将数据导入到Oracle指定的表空间的具体内容如下: 首先,在ArcCatalog中建立指定表空间的数据库连接(要以指定表空间的用户登录): 然后,在ArcCatlog中定位到数据源,选中并拷贝图层; ...
- SUPEROBJECT序列数据集为JSON
// SUPEROBJECT 序列数据集 cxg 2017-1-12// {"data":[{"c1":1,"c2":1}]};// DEL ...