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:\) 真是好题一道!这道题我想了很久很久,就得这一题可以直接完全贪心,可惜最后还是失败了,但是对贪心的深入思考也换来了一个最优解方案.然后 ...
 
随机推荐
- 算法复习——trie树(poj2001)
			
题目: 题目描述 给出 n 个单词(1<=n<=1000),求出每个单词的非公共前缀,如果没有,则输出自己. 输入格式 输入 N 个单词,每行一个,每个单词都是由 1-20 个小写字母构成 ...
 - Snmp的学习总结(二)
			
一.SNMP简介 SNMP指的是简单网络管理协议.它属于TCP/IP五层协议中的应用层协议.它提供了一种简单和方便的模式来管理网络中的各个元素.这里的元素就是各个被管理的对象,可以是因特网中的某个硬件 ...
 - 转载: GMM-HMM学习笔记
			
转载地址:http://blog.csdn.net/davidie/article/details/46929269 最近几天钻研了语音处理中的GMM-HMM模型,阅读了一些技术博客和学术论文,总算是 ...
 - cf725F Family Photos
			
Alice and Bonnie are sisters, but they don't like each other very much. So when some old family phot ...
 - maven配置中国下载源【转:http://www.cnblogs.com/libingbin/p/5949483.html】
			
修改 配置文件 maven 安装 路径 F:\apache-maven-3.3.9\conf 修改 settings.xml或者在.m2文件夹下新建一个settings.xml 阿里源 <mir ...
 - UOJ#370. 【UR #17】滑稽树上滑稽果
			
$n \leq 1e5$个点,每个点有个权值$a_i \leq 2e5$.现将点连成树,每个点$i$的链接代价为$a_i \ \ and \ \ i父亲的代价$,这里的$and$是二进制按位与,求最小 ...
 - 安装sqlServer2012失败补救
			
今天拿着新电脑win10,装数据库2012,装了第一次,没装上,有一半的工具都失败了,慌了.. 连management studio都没装上,我用navicat也连不上. 卸了,第二次安装,装一半卡住 ...
 - ShareSDK中微信分享错误总结
			
项目中用到微信分享,可向好友或朋友圈分享链接时,分享人可以打开网站,查看消息者却始终不能打开网站.试了N种方法,重写了N次分享模块,均没办法解决. 在无意中查看分享链接时发现,朋友圈里分享后,原始链接 ...
 - CMDB资产管理系统的数据表设计
			
Server表: asset = models.OneToOneField('Asset') 主机名(hostname) sn号(sn) 制造商(manufacture) 系统(os_platform ...
 - python多线程实践小结
			
参考:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html #!/usr/bin/env python import sys ...