2020.2.13 JZOJ1327 Mobile Service题解

今天比赛心态完全的崩了,居然连滚动数组都忘了。
除了T3,其他题目都比较水,所以就来发一篇题解。
第一次写,有错误或不好的地方请多多指教。
题目大意
一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。
输入
第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) ,并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。
输出
一个数M,表示最小服务花费。
样例输入
5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1
样例输出
5
题解
毕竟这是一道求最优解的问题,那么很容易就会想到dp。
首先,设一个状态f[i][j][k][s],表示第i个请求,三个服务员分别在j,k,s这三个位置
那么很容易列出状态转移方程:
q[i]表示第i个请求

f[i+1][q[i+1]][k][s]=min(f[i+1][q[i+1]][k][s],f[i][j][k][s]+c[j][q[i+1]];(位置为j的服务员去)
f[i+1][j][q[i+1]][s]=min(f[i+1][j][q[i+1]][s],f[i][j][k][s]+c[k][q[i+1]]; (位置为k的服务员去)
f[i+1][j][k][q[i+1]]=min(f[i+1][j][k][q[i+1]],f[i][j][k][s]+c[s][q[i+1]]; (位置为s的服务员去)

但是这样很明显会MLE和TLE,所以我们考虑缩状态。
经过观察,发现每一个状态里面都有q[i+1],所以我们就可以q[i+1]去掉
那么状态转移方程就是:

f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+c[q[i]][q[i+1]];
f[i+1][q[i]][k]=min(f[i+1][q[i]][k],f[i][j][k]+c[j][q[i+1]];
f[i+1][j][q[i+1]]=min(f[i+1][j][q[i+1]],f[i][j][k]+c[k][q[i+1]];

即使是这样还是会MLE,所以我们还需要用滚动数组来优化(我比赛时忘记了滚动数组)。
上代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define RE register
#define ll long long
using namespace std;
int n,m,ans=0x3f3f3f3f;
int x=0,f[2][201][201],c[201][201],q[1001];
int main() {
	scanf("%d%d",&n,&m);
	for(RE int i=1;i<=n;i++)
		for(RE int j=1;j<=n;j++)
		scanf("%d",&c[i][j]);
	for(RE int i=1;i<=m;i++)scanf("%d",&q[i]);
	q[0]=3;memset(f,0x3f3f3f3f,sizeof(f));
	f[0][1][2]=0;
	for(RE int i=0;i<m;i++) {
		x^=1;memset(f[x],0x3f3f3f3f,sizeof(f[x]));
		for(RE int j=1;j<=n;j++)
			for(RE int k=1;k<=n;k++)
			if(j!=k&&q[i]!=j&&q[i]!=k) {
				f[x][j][k]=min(f[x][j][k],f[x^1][j][k]+c[q[i]][q[i+1]]);
				f[x][q[i]][k]=min(f[x][q[i]][k],f[x^1][j][k]+c[j][q[i+1]]);
				f[x][j][q[i]]=min(f[x][j][q[i]],f[x^1][j][k]+c[k][q[i+1]]);
			}
	}
	for(RE int i=1;i<=n;i++) {
		for(RE int j=1;j<=n;j++)
		ans=min(ans,f[x][i][j]);
	}
	printf("%d\n",ans);
} 

猜你喜欢

转载自blog.csdn.net/MZHjr/article/details/104345800